2D numpy数组的掩码

7

我希望在一个二维的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以屏蔽val(5,8)。如果有人能指导我,我将不胜感激。
提前致谢。

我的第一个想法是 lonmask&latmask,但我不太明白什么是“masked lat (5,)”。 - B. M.
我不太明白你在问什么。你能否给出一个具体的例子,展示你的输入和期望的输出? - ali_m
1个回答

9
如果我理解你的问题正确的话,你有两个一维数组,分别代表二维数组中的y和x(纬度和经度)位置。你想要基于在二维数组中的x/y位置来掩盖一个区域。
关键部分是要理解2D数组的掩码也是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)

这将产生:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]]

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

在您的情况下,您有两个一维数组x和y,您需要从中创建一个二维掩码。例如:

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,它们是同一个对象) 进行切片会在该位置新增一个轴,将一维数组转换为二维数组。如果您之前见过这个,那么可以快速查看下 xmask[np.newaxis, :]ymask[:, 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]]

我该如何更改逻辑,以便在组合两个1D掩码以创建2D掩码时,无论哪个1D掩码为True,都会进行掩码。我有一个非常类似的问题,只是我想为所有经度屏蔽某些纬度和为所有纬度屏蔽某些经度。我有一个用于纬度的1D掩码和一个用于经度的1D掩码。 - Will.Evo
1
@Will.Evo,为了有效地通过两个1D掩码剪切2D数组,请按上述方式创建“mask”,然后使用“clipped_z = z [mask]”进行剪切。这将创建一个1D数组,然后可以使用“clipped_z.reshape()”转换为2D。适当的重塑尺寸可以通过“np.sum(xmask)”和“np.sum(ymask)”获得,它们计算“True”的数量。 - Mike Bannister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接