根据函数结果从另一个ndarray创建一个ndarray

时间:2018-02-13 21:25:57

标签: numpy

我有三个ndarray如下,其中x和y是我的坐标网格,z是我的数据:

x: [[-11.   -11.   -11.   -11.   -11.  ]
 [ -9.25  -9.25  -9.25  -9.25  -9.25]
 [ -7.5   -7.5   -7.5   -7.5   -7.5 ]
 [ -5.75  -5.75  -5.75  -5.75  -5.75]
 [ -4.    -4.    -4.    -4.    -4.  ]]

y: [[51.   52.25 53.5  54.75 56.  ]
 [51.   52.25 53.5  54.75 56.  ]
 [51.   52.25 53.5  54.75 56.  ]
 [51.   52.25 53.5  54.75 56.  ]
 [51.   52.25 53.5  54.75 56.  ]]

z: [[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0. 21.  0.  0.  0.]
 [21. 21.  4.  0.  0.]
 [21. 21.  4.  4.  0.]]

我希望做这样的事情:

coords = np.stack((x, y)).T
for (x,y), value in np.ndenumerate(z):    
    xx,yy = coords[x][y]
    if not m.is_land(xx,yy):
        z[x][y] = 0 

如何在numpy中正确执行此操作?更好的是创建一个新数组而不是尝试更改z。

更新

如果我在上面的代码之后打印(z):

z: [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 4. 0. 0.]
 [0. 0. 0. 0. 0.]]

但是当我稍后在我的代码中使用z时,我得到:

    plt.contour(x[:,0], x[0,:], z.T,linewidths=0.5,colors='k',z=99)
TypeError: 'int' object is not subscriptable

我的代码似乎在某种程度上破坏了z。

1 个答案:

答案 0 :(得分:1)

要生成蒙版,您可以使用列表推导,然后重新整形结果并相应地将元素设置为z

mask = np.reshape([
            m.is_land(i, j) for i, j in zip(x.ravel(), y.ravel())
       ], 
       z.shape
)

z[~mask] = 0