我有三个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。
答案 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