Python 填充Numpy数组的有效方法

Python 填充Numpy数组的有效方法,python,numpy,Python,Numpy,我正在寻找一种比双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]))*

我正在寻找一种比双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]

您似乎正在使用以前更新的列中的数据,一次更新一列
结果
数组。这使得外部循环很难矢量化,我不认为你能做到,除非你的数据有某种可以利用的结构。内部循环的矢量化非常简单:

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\u j=np.arange(k-d-2,k+1)
数组,然后在循环内用类似
j=base\u j[d-i+1::
的东西将其切分,您似乎每次只更新一列
结果,使用以前更新的列中的数据。这使得外部循环很难矢量化,我不认为你能做到,除非你的数据有某种可以利用的结构。内部循环的矢量化非常简单:

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\u j=np.arange(k-d-2,k+1)
数组,然后在循环内部用类似
j=base\u j[d-i+1::
的东西对其进行切片,您可以通过巧妙的广播摆脱内部循环

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
非常谨慎

你可以通过巧妙的广播摆脱内环

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
非常谨慎

您是否修改了结果?这让我们担心
结果[j+1,i-1]
。我是,但结果最初声明为
result=numpy.zero((len(y),d)
,因此我不会访问任何尚未声明的内容。您是否修改了结果?这让我们担心
结果[j+1,i-1]
。我是,但结果最初声明为
result=numpy.zeros((len(y),d)
,因此我不会访问任何尚未声明的内容。不清楚您为什么接受我的,@Jaime's更具可读性。Yoiu确实通过切片而不是花哨的索引使其工作,因此不会发生数据复制。性能方面应该更好,不清楚您为什么接受我的,@Jaime's更具可读性。Yoiu成功地将其与切片而不是花哨的索引一起工作,因此不会发生数据复制。从性能角度来看,它应该更好,