蒙版二维数字阵列

2024-10-01 07:16:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在2D numpy数组上应用掩码。但它不能正常工作。假设我有

val(lat, lon)  ---> my 2D array (20, 30)


Mask_lat = np.ma.masked_array(lat, mask=latmask)  ---> masked lat (5,)


Mask_lon = np.ma.masked_array(lon, mask =lonmask)   ---> masked lon (8,)


Maks_val = np.ma.masked_array(val, mask=mask_lat_lon) ---> ?

我不知道如何传递一个正确的mask_lat_lon来屏蔽{}。如果有人能指导我,我将不胜感激。在

提前谢谢你。在


Tags: numpymynpmaskval数组arraylon
1条回答
网友
1楼 · 发布于 2024-10-01 07:16:36

如果我没弄错你的问题,你有两个1D数组,它们代表2D数组中的y和x(lat和long)位置。要根据二维阵列中的x/y位置遮罩区域。在

要理解的关键部分是2D数组的遮罩也是2D的

例如,让我们遮罩二维阵列的单个元素:

import numpy as np

z = np.arange(20).reshape(5, 4)
mask = np.zeros(z.shape, dtype=bool)

mask[3, 2] = True

print z
print np.ma.masked_array(z, mask)

这就产生了:

^{pr2}$

在您的例子中,您有两个1dx和y数组,您需要从中创建2D掩码。例如:

import numpy as np

x = np.linspace(-85, -78, 4)
y = np.linspace(32, 37, 5)
z = np.arange(20).reshape(5, 4)

xmask = (x > -82.6) & (x < -80)
ymask = (y > 33) & (y < 35.6)

print xmask
print ymask

然后我们需要使用广播将它们组合成一个二维掩模:

mask = xmask[np.newaxis, :] & ymask[:, np.newaxis]

使用newaxis(或者None,它们是同一个对象)在该位置添加一个新轴,将1D数组转换为2D数组。如果您以前见过这种情况,那么快速了解一下xmask[np.newaxis, :]和{}是什么样子是很有用的:

In [14]: xmask
Out[14]: array([False, False,  True, False], dtype=bool)

In [15]: ymask
Out[15]: array([False,  True,  True, False, False], dtype=bool)

In [16]: xmask[np.newaxis, :]
Out[16]: array([[False, False,  True, False]], dtype=bool)

In [17]: ymask[:, np.newaxis]
Out[17]:
array([[False],
       [ True],
       [ True],
       [False],
       [False]], dtype=bool)

mask将是(请记住,True元素是被屏蔽的):

In [18]: xmask[np.newaxis, :] & ymask[:, np.newaxis]
Out[18]:
array([[False, False, False, False],
       [False, False,  True, False],
       [False, False,  True, False],
       [False, False, False, False],
       [False, False, False, False]], dtype=bool)

最后,我们可以基于这个掩码从z创建一个2D掩码数组:

arr = np.masked_array(z, mask)

最后的结果是:

 [[ 0  1  2  3]
  [ 4  5    7]
  [ 8  9   11]
  [12 13 14 15]
  [16 17 18 19]]

相关问题 更多 >