我需要以下问题的Pythonic循环开销的帮助:我正在写一个函数来计算像素流算法,它是2D Numpy数组上的经典动态编程算法。它要求:我可以通过numpy避免Python循环开销的动态编程吗?
1)访问数组中的所有元素至少一次这样的:
for x in range(xsize):
for y in range(ysize):
updateDistance(x,y)
2)潜在的下列基于它看起来像一个元素的邻居的值的元素的一个路径这
while len(workingList) > 0:
x,y = workingList.pop()
#if any neighbors of x,y need calculation, push x,y and neighbors on workingList
#else, calculate flow on pixels as a sum of flow on neighboring pixels
不幸的是,我似乎得到了很多Python的循环开销对#1,即使调用updateDistance是pass
。我认为这是一个足够经典的算法,在Python中必须有一个很好的方法来避免一些循环开销。我也担心,如果我能修好#1,我会在#2的循环中被淘汰。
任何关于快速遍历2D numpy数组中的元素并可能更新该数组中的元素链的建议?
编辑:冲洗出来的#2
更多的细节看来我也许能向量化的第一环,或许与矢量化的np.meshgrid
电话。
该循环部分有点复杂,但这里是一个简化版本。我很关心循环和索引到相邻元素:
#A is a 2d cost matrix
workingList = [(x,y)]
while len(workingList) > 0:
x,y = workingList.pop()
neighborsToCalculate = []
for n in neighborsThatNeedCalculation(x,y): #indexes A to check neighbors of (x,y)
neighborsToCalculate.append(n)
if len(neighborstToCalculate) != 0:
workingList.append((x,y))
workingList.extend(neighborsToCalculate)
else:
for xn,yn in neighbors(x,y):
A[x,y] += 1+A[xn,yn]
这是一个经典的宽度优先搜索问题。如果这可以并行,那将是非常好的。它可能不能以其目前的形式,因为它遵循了一条道路,但我很乐意提供建议。
你可以在第二个循环发布更多细节吗? – Simon
@Simon是的,我多了一些。 – Rich