如果我理解你的问题正确的话,你有两个一维数组,分别代表二维数组中的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]]
lonmask&latmask
,但我不太明白什么是“masked lat (5,)”。 - B. M.