numpy 我可以用一种更pythonic的方式来处理我的条件数组操作吗?

d4so4syb  于 9个月前  发布在  Python
关注(0)|答案(2)|浏览(106)

在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结构的损失。

ejk8hzay

ejk8hzay1#

你的两个操作可以看作是一个diff,只是根据u的符号进行了移位:

x = np.zeros_like(f)
d = np.diff(f, axis=1)
x[:, 1:-1] = np.where(u[:, 1:-1]>0, d[:, :-1], d[:, 1:])

字符串

  • 注意,你可以在所有切片中将第一个轴上的:替换为1:-1,以真正匹配你的循环。

输出量:

array([[  0,   0,   0,   0,   0,   0,   0],
       [  0,  10,  12,   8,  10, -50,   0],
       [  0,  11,  11,  11,  11,  11,   0],
       [  0,   0,   0,   0,   0,   0,   0]])


匹配你的循环的条件是:

x[1:-1, 1:-1] = np.where(u[1:-1, 1:-1]>0,
                         u[1:-1, 1:-1]*(f[1:-1, 1:-1]-f[1:-1, :-2]),
                        -u[1:-1, 1:-1]*(f[1:-1, 2:]-f[1:-1, 1:-1]))

3phpmpom

3phpmpom2#

我想你可能想用np.ndenumerate来遍历你的多维数组u,这样你就只有一层for了。
参见https://numpy.org/doc/stable/reference/generated/numpy.ndenumerate.html#numpy.ndenumerate上的文档

相关问题