1

我正在寻找一种比双 for 循环更有效的方法来填充 2d numpy 数组。我遇到的问题是数组值依赖于其他几个数组。

在下面的代码中,k 和 d 是整数,y 和 result 是数组。任何帮助将不胜感激。

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]
4

2 回答 2

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:].

于 2013-10-20T15:15:02.107 回答
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过于谨慎地使用了

于 2013-10-20T15:15:12.837 回答