Numpy数组:有效地分配值

时间:2018-06-09 13:26:10

标签: python numpy

我有一个数组,我想循环其值来更新它,如下所示:

import numpy as np
arr=np.ones((5,7))
for i in range(1,arr.shape[0]-1):
    for j in range(1,arr.shape[1]-1):
        arr[i,j]=arr[i+1,j]+arr[i,j+1]

根据需要,结果是

[[1. 1. 1. 1. 1. 1. 1.]
 [1. 2. 2. 2. 2. 2. 1.]
 [1. 2. 2. 2. 2. 2. 1.]
 [1. 2. 2. 2. 2. 2. 1.]
 [1. 1. 1. 1. 1. 1. 1.]]

但是,for循环非常慢,我想知道是否有办法提高效率。

编辑:输入并不总是np.ones((5,7)),它通常会更加异构。

2 个答案:

答案 0 :(得分:2)

如果你在"内部"周围画一个盒子。元素,您的代码将这些元素的新值设置为(a)该框"向下移动一行"和(b)该框"向右移动一列& #34;

例如:

-----     -----     -----
-XXX-     -----     --XXX
-XXX-  =  -XXX-  +  --XXX
-XXX-     -XXX-     --XXX
-----     -XXX-     -----

你可以不用循环来做到这一点:

arr[1:-1,1:-1] = arr[2:,1:-1] + arr[1:-1,2:]

答案 1 :(得分:2)

以下是问题代码。

import numpy as np 
a=np.random.randn(5, 7)
a1=a
a2=a
mid_mat= a[1:, :][:, :-1]+a[:, :-1][:-1, :]
a1[1:-1, 1:-1] = mid_mat[:-1, :-1]

# Assert Code

for i in range(1,a.shape[0]-1):
    for j in range(1,a.shape[1]-1):
        a2[i,j]=a[i+1,j]+a[i,j+1]

np.testing.assert_array_equal(a1, a2)