我有一个数组,我想循环其值来更新它,如下所示:
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))
,它通常会更加异构。
答案 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)