在Python中使用numpy
,我必须对numpy
2D数组进行一些迭代。我将原始问题归结为它的本质:
f = np.array([[0, 0, 0, 0, 0, 0, 0], [0, 10, 22, 30, 40, 50, 0], [0, 11, 22, 33, 44, 55, 0], [0, 0, 0, 0, 0, 0, 0]])
u = np.array([[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, -1, 1], [1, 1, -1, -1, -1, 1, 1], [1, 1, 1, 1, 1, 1, 1]])
x = np.zeros_like(f)
for i in range(1,u.shape[0]-1):
for j in range(1,u.shape[1]-1):
if u[i,j] > 0:
x[i,j] = u[i,j]*(f[i,j]-f[i,j-1])
else:
x[i,j] = -u[i,j]*(f[i,j+1]-f[i,j])
字符串
在这个迭代中,我必须遍历所有的2D索引。有没有更优雅的方法?如果没有关于u的条件,我会写:
y = np.zeros_like(f)
y[1:-1, 1:-1] = u[1:-1, 1:-1] * (f[1:-1, 1:-1] - f[1:-1, :-2])
型
如果u>0,结果是一样的
我本来想用m = ma.masked_array(u, (u > 0)).mask
,但是通过像f[m]
这样的索引,我只得到了一个1D数组,所以我得到了2D结构的损失。
2条答案
按热度按时间ejk8hzay1#
你的两个操作可以看作是一个
diff
,只是根据u
的符号进行了移位:字符串
:
替换为1:-1
,以真正匹配你的循环。输出量:
型
匹配你的循环的条件是:
型
3phpmpom2#
我想你可能想用
np.ndenumerate
来遍历你的多维数组u
,这样你就只有一层for
了。参见https://numpy.org/doc/stable/reference/generated/numpy.ndenumerate.html#numpy.ndenumerate上的文档