【发布时间】:2011-11-22 07:32:00
【问题描述】:
我需要帮助解决以下问题的 Pythonic 循环开销:我正在编写一个计算像素流算法的函数,该算法是 2D Numpy 数组上的经典动态编程算法。它需要:
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
不幸的是,即使对 updateDistance 的调用是 pass,我似乎在 #1 上也得到了很多 Pythonic 循环开销。我认为这是一个足够经典的算法,在 Python 中必须有一个好的方法可以避免一些循环开销。我还担心如果我能修复 #1,我会在 #2 的循环中被破坏。
关于快速遍历二维 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 是的,我又充实了一些。
标签: numpy dynamic-programming memoization