0

我有一些数组

a = np.array([1, 2, 3])

和一些面具

mask = np.ones(a.shape, dtype=bool)

并且可以做到

np.testing.assert_almost_equal(a[mask], a)  # True

然而,

np.ma.array(a, mask)

相当于

a[np.logical_not(mask)]

np.ma.array(a, np.logical_not(mask))

相当于

a[mask]

这对我来说似乎违反直觉。

希望 numpy 对这种设计选择做出解释。

4

1 回答 1

0
In [6]: a = np.array([1,2,3])                                                            
In [7]: idx = np.array([1,0,1], bool)                                                    
In [8]: idx                                                                              
Out[8]: array([ True, False,  True])
In [9]: a[idx]                                                                           
Out[9]: array([1, 3])

仅仅因为您调用了 boolean array mask,并不意味着它在每个意义上都表现为“掩码”。我故意选择一个不同的名字。是的,我们确实经常调用这样的数组mask并谈论“屏蔽”,但我们真正在做的是“选择”。操作返回其中为 True的a[idx]元素。这与使用元组索引相同:aidxnonzero

In [13]: np.nonzero(idx)                                                                 
Out[13]: (array([0, 2]),)

np.ma掩码中使用“掩码”的含义,覆盖。

In [10]: mm = np.ma.masked_array(a, mask=idx)                                            
In [11]: mm                                                                              
Out[11]: 
masked_array(data=[--, 2, --],
             mask=[ True, False,  True],
       fill_value=999999)
In [12]: mm.compressed()                                                                 
Out[12]: array([2])

在显示中,屏蔽值显示为“--”。正如np.ma文档所说,那些元素被认为是无效的,并将被排除在计算之外。

mm.filled返回一个数组,其中 'masked' 值被 'fill' 替换:

In [16]: mm.filled()                                                                     
Out[16]: array([999999,      2, 999999])

我们可以做同样的事情idx

In [17]: a[idx] = 999999                                                                 
In [18]: a                                                                               
Out[18]: array([999999,      2, 999999])
于 2020-05-28T20:09:30.760 回答