加速您的線搜索算法的另一種方法是預先計算每一行的起始點,然後應用昂貴的邏輯來計算每個點的線。
我對邏輯進行了有限的觀察(因爲您沒有提供完整的線路識別邏輯),它可以計算快速向量化代碼中的起點。
在能夠實現快速矢量化代碼這樣的事情的第一步是要能夠找出哪些點在一條線上,但高於其直接點不在:在
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.
我不認爲這個問題是特別清楚。你有一個零和字符串的列表,如'x0'或他們是1嗎?這條線是什麼意思?線搜索算法的規則是什麼?他們可以對角移動嗎? – pelson 2012-07-18 20:51:22
@pelson'x1','x2','x3','y1','y2'...都是不同的值。我寫了'x1'和'y1'來區分這些值屬於不同的行。我添加一個鏈接到這個數字來說清楚。我從包含零和數值的數組中繪製圖形,如原始文章中所示。我需要沿着每條線找到最大值(每行中的值不以降序排列)。我無法在這裏上傳圖片,所以我附上了一個鏈接到這個圖:i.imgur.com/W9O0I.png – user1535026 2012-07-19 12:36:43
在你提供的例子數組中,你會如何判斷z3在y行上不存在?是不是你想要某種優先級而不是那些對角線移動的優先級(以行爲單位)?線條可以水平移動嗎? – pelson 2012-07-19 12:50:49