2012-07-18 28 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