2012-07-18 57 views
1

我有一个数组,看起来像:如何确定设置连接线的从阵列在python

[0 X1 0 0 Y1 0 Z1
0 0 X 2 0 Y2 0 Z2
0 0 X3 0 0 Y3 Z3
0 0×4 0 0 Y4 Z4
0 X5 0 0 0 Y5 Z5
0 0 0 0 Y6 0 0]

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

+0

我不认为这个问题是特别清楚。你有一个零和字符串的列表,如'x0'或他们是1吗?这条线是什么意思?线搜索算法的规则是什么?他们可以对角移动吗? – pelson 2012-07-18 20:51:22

+0

@pelson'x1','x2','x3','y1','y2'...都是不同的值。我写了'x1'和'y1'来区分这些值属于不同的行。我添加一个链接到这个数字来说清楚。我从包含零和数值的数组中绘制图形,如原始文章中所示。我需要沿着每条线找到最大值(每行中的值不以降序排列)。我无法在这里上传图片,所以我附上了一个链接到这个图:i.imgur.com/W9O0I.png – user1535026 2012-07-19 12:36:43

+0

在你提供的例子数组中,你会如何判断z3在y行上不存在?是不是你想要某种优先级而不是那些对角线移动的优先级(以行为单位)?线条可以水平移动吗? – pelson 2012-07-19 12:50:49

回答

1

我不知道任何能够提供您想要的功能的任何东西。如果您已经编写了逻辑,而且速度很慢,您是否考虑过使用Cython编码。对于简单类型的循环操作,您可以获得显着的加速。

1

加速您的线搜索算法的另一种方法是预先计算每一行的起始点,然后应用昂贵的逻辑来计算每个点的线。

我对逻辑进行了有限的观察(因为您没有提供完整的线路识别逻辑),它可以计算快速向量化代码中的起点。

在能够实现快速矢量化代码这样的事情的第一步是要能够找出哪些点在一条线上,但高于其直接点不在:在

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

谢谢你。我会尝试你的建议。 – user1535026 2012-07-20 12:59:45