我根据几个条件创建了一个索引
transition = np.where((rain>0) & (snow>0) & (graup>0) & (xlat<53.) & (xlat>49.) & (xlon<-114.) & (xlon>-127.)) #indexes the grids where there are transitions
形状为(3,259711),如下所示:
array([[ 0, 0, 0, ..., 47, 47, 47], #hour
[847, 847, 848, ..., 950, 950, 951], #lat gridpoint
[231, 237, 231, ..., 200, 201, 198]]) #lon gridpoint
我有几个其他变量(例如temp),其形状为(48,1015,1359),对应于hour,lat,lon。
看作索引是我的有效网格点,如何屏蔽所有变量,如temp,以便它保留(48,1015,1359)形状,但屏蔽索引之外的值。
答案 0 :(得分:0)
In [90]: arr = np.arange(24).reshape(6,4)
In [91]: keep = (arr % 3)==1
In [92]: keep
Out[92]:
array([[False, True, False, False],
[ True, False, False, True],
[False, False, True, False],
[False, True, False, False],
[ True, False, False, True],
[False, False, True, False]], dtype=bool)
In [93]: np.where(keep)
Out[93]:
(array([0, 1, 1, 2, 3, 4, 4, 5], dtype=int32),
array([1, 0, 3, 2, 1, 0, 3, 2], dtype=int32))
keep
掩码的简单应用给出了所需值的1d数组。我也可以使用where
元组进行索引。
In [94]: arr[keep]
Out[94]: array([ 1, 4, 7, 10, 13, 16, 19, 22])
使用keep
,或者更确切地说是布尔反转,我可以创建一个蒙版数组:
In [95]: np.ma.masked_array(arr,mask=~keep)
Out[95]:
masked_array(data =
[[-- 1 -- --]
[4 -- -- 7]
[-- -- 10 --]
[-- 13 -- --]
[16 -- -- 19]
[-- -- 22 --]],
mask =
[[ True False True True]
[False True True False]
[ True True False True]
[ True False True True]
[False True True False]
[ True True False True]],
fill_value = 999999)
np.ma.masked_where(~keep, arr)
做同样的事情 - 只是一个不同的参数顺序。它仍然需要布尔掩码数组。
我可以从where
元组开始做同样的事情:
In [105]: idx = np.where(keep)
In [106]: mask = np.ones_like(arr, dtype=bool)
In [107]: mask[idx] = False
In [108]: np.ma.masked_array(arr, mask=mask)
np.ma
类中可能有一些东西通过一次调用来执行此操作,但它必须执行相同类型的构造。
这也有效:
x = np.ma.masked_all_like(arr)
x[idx] = arr[idx]