在python中如何从数组中确定连接线集

在python中如何从数组中确定连接线集,python,numpy,nearest-neighbor,Python,Numpy,Nearest Neighbor,我有一个数组,看起来像: [0 x10 y1 0 z1 0X20Y20Z2 0 x3 0 y3 z3 0 x 4 0 y4 z4 0x50y5z5 0 0 0 y6 0 0] 我需要从数组中确定一组连接线(即连接到点[x1,x2,x3],[y1,y2,y3…],[z1,z2,z3…]),然后需要在每条线中找到最大值,即max{x1,x2,x3,…},max{y1,y2,y3…}等。我试图使用kdtree进行最近邻搜索,但它返回相同的数组。我有一个大小为(200 x 8000)的数组。有没有更简单

我有一个数组,看起来像:

[0 x10 y1 0 z1
0X20Y20Z2
0 x3 0 y3 z3
0 x 4 0 y4 z4
0x50y5z5
0 0 0 y6 0 0]


我需要从数组中确定一组连接线(即连接到点[x1,x2,x3],[y1,y2,y3…],[z1,z2,z3…]),然后需要在每条线中找到最大值,即max{x1,x2,x3,…},max{y1,y2,y3…}等。我试图使用kdtree进行最近邻搜索,但它返回相同的数组。我有一个大小为(200 x 8000)的数组。有没有更简单的方法?Thx.

我不知道有什么东西能提供您想要的现成功能。如果您已经编写了逻辑,但是速度很慢,您是否考虑过循环代码。对于简单类型的循环操作,您可以获得显著的加速。

另一种加速行搜索算法的方法是预先计算每行的起点,然后应用昂贵的逻辑从这些点计算行

我对逻辑有一个有限的了解(因为您没有提供完整的行标识逻辑),它可以计算快速矢量化代码的起点

在快速矢量化代码中实现这一点的第一步是能够找出哪些点在一条直线上,但它们上面的直接点不是:

import numpy

# using the array that was provided in the question
a = """0 x1 0 0 y1 0 z1 
0 0 x2 0 y2 0 z2 
0 0 x3 0 0 y3 z3 
0 0 x4 0 0 y4 z4 
0 x5 0 0 0 y5 z5 
0 0 0 0 y6 0 0"""

array = numpy.array([int(v.strip()) if v.strip().isdigit() else i for i, v in enumerate(a.split(' '))]).reshape(6, 7) 
结果将生成一个数组,如下所示:

>>> print repr(array)
array([[ 0,  1,  0,  0,  4,  0,  6],
       [ 0,  0   9,  0, 11,  0, 13],
       [ 0,  0, 16,  0,  0, 19, 20],
       [ 0,  0, 23,  0,  0, 26, 27],
       [ 0, 29,  0,  0,  0, 33, 34],
       [ 0,  0,  0,  0, 39,  0,  0]])
从这里,我们可以进行一些numpy滚动:

 >>> print `numpy.roll(array, 1, axis=0)`
 array([[ 0,  0,  0,  0, 39,  0,  0],
        [ 0,  1,  0,  0,  4,  0,  6],
        [ 0,  0,  9,  0, 11,  0, 13],
        [ 0,  0, 16,  0,  0, 19, 20],
        [ 0,  0, 23,  0,  0, 26, 27],
        [ 0, 29,  0,  0,  0, 33, 34]])
可以将其组合起来,为我们提供直线的垂直起点:

>>> potential_start_points = (array != 0) & (numpy.roll(array, 1, axis=0) == 0)
>>> # include the top row points, as they are certainly start points
>>> potential_start_points[0, :] = (array != 0)[0, :]
>>> print `potential_start_points`
array([[False,  True, False, False,  True, False,  True],
       [False, False,  True, False, False, False, False],
       [False, False, False, False, False,  True, False],
       [False, False, False, False, False, False, False],
       [False,  True, False, False, False, False, False],
       [False, False, False, False,  True, False, False]], dtype=bool)
从这里,可以细化向量化逻辑以挑选对角线等,但我会尝试迭代每个Trues并应用更复杂的基于索引的逻辑

xs, ys = numpy.where(potential_start_points)

for x, y in zip(xs, ys):
    # do more complex logic here ...

毕竟,在这种情况下,问题现在从迭代6x7=42个数字减少到只迭代7个。

我认为这个问题不是特别清楚。你有一个0和字符串的列表,比如“x0”还是“1”?你说的线是什么意思?找线算法的规则是什么?它们能沿对角线移动吗?@pelson'x1','x2','x3','y1','y2'。。。都是不同的价值观。我写了'x1'和'y1'来区分这些值在不同的行中。我在图中添加了一个链接,以明确说明这一点。我从包含零和值的数组中绘制图,如原始帖子所示。我需要沿着每行找到最大值(每行中的值不是按降序排列的)。我无法在此处上传该图,因此我附加了一个指向该图的链接:I.imgur.com/W9O0I.pn在您提供的示例数组中,您如何判断z3在y线上不存在?是不是你想让降序(按行)数字比对角线移动的数字更优先?线可以水平移动吗?点主要位于垂直线中,即在类似的列中,如果该线下方的点为零,它们可能会向左或向右移动一列。z1,z2。。z5都在一列中。如果X线在x2处向右移动,然后在该列中继续移动,直到x4,然后在x5处向右移动。我可以在每个点上进行搜索,我可以使用if/else循环跟踪所有行,但需要为1600000点进行搜索时需要大量资源。如果有一些方法可以从图像/数组中跟踪这些线,而不是手动跟踪所有点,可能会更容易。谢谢。我会按照你的建议去做。