我正在寻找一种更有效的方法来填充2d numpy数组而不是双for循环。我遇到的问题是数组值依赖于其他几个数组。
在下面的代码中,k和d是整数,y和结果是数组。任何帮助将不胜感激。
for i in xrange(1,d):
for j in xrange(k-i-1, k+1):
result[j][i] = ((x - y[j])/(y[j+i] - y[j]))*result[j,i-1] + ((y[j+i+1]-x)/(y[j+i+1] - y[j+1]))*result[j+1,i-1]
答案 0 :(得分:4)
您似乎使用先前更新的列中的数据一次更新result
数组一列。这使得很难对外部循环进行矢量化,我不认为你可以做到这一点,除非你的数据有一些可被利用的结构。内部循环非常简单地进行矢量化:
for i in xrange(1, d):
j = np.arange(k-i-1, k+1)
result[j, i] = ((x - y[j]) / (y[j+i] - y[j]) * result[j, i-1] +
(y[j+i+1] - x) / (y[j+i+1] - y[j+1]) * result[j+1, i-1])
通过在循环外部定义base_j = np.arange(k-d-2, k+1)
数组,然后使用类似j = base_j[d-i+1:]
的内容将其切换到循环中,可以获得一些微小的改进。
答案 1 :(得分:4)
你可以通过聪明的广播摆脱内部循环
tmp = ((x - y[k-i+1:k+1])/(y[k+1:k+1+i] - y[j]))*result[k-i+1:k+1,i-1] + ((y[k+2:k+i+2]-x)/(y[k+2:k+i+2] - y[k-i+2:k+2]))*result[k-i+2:k+2,i-1]
result[k-i+1:k+1, i] = tmp
但是因为你在内部循环中的界限依赖于外部循环,所以你也无法通过广播将其删除。
我过度使用tmp