2011-01-07 40 views
9

假设我有以下numpy的数组:掩模在一列中根据值的2D阵列numpy的

a = [[1, 5, 6], 
    [2, 4, 1], 
    [3, 1, 5]] 

我想屏蔽所有具有在第一列1的行。也就是说,我想

[[--, --, --], 
    [2, 4, 1], 
    [3, 1, 5]] 

这可能使用numpy的屏蔽数组操作呢?如何做到这一点?

谢谢。

回答

7
import numpy as np 

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

np.ma.MaskedArray(a, mask=(np.ones_like(a)*(a[:,0]==1)).T) 

# Returns: 
masked_array(data = 
[[-- -- --] 
[2 4 1] 
[3 1 5]], 
      mask = 
[[ True True True] 
[False False False] 
[False False False]]) 
2

可以通过

mask = numpy.repeat(a[:,0]==1, a.shape[1]) 

和掩蔽阵列通过创建所需掩模

masked_a = numpy.ma.array(a, mask=numpy.repeat(a[:,0]==1, a.shape[1])) 
+0

感谢您的回复Sven!我对numpy很陌生,并没有意识到重复的方法。将查找它。 – Curious2learn 2011-01-07 17:58:20

0

你可以简单地创建一个空的掩模,然后使用numpy的广播(如@eumiro显示),但使用元素和按位“或”运算符|

>>> a = np.array([[1, 5, 6], [2, 4, 1], [3, 1, 5]]) 

>>> mask = np.zeros(a.shape, bool) | (a[:, 0] == 1)[:, None] 

>>> np.ma.array(a, mask=mask) 
masked_array(data = 
[[-- -- --] 
[2 4 1] 
[3 1 5]], 
      mask = 
[[ True True True] 
[False False False] 
[False False False]], 
     fill_value = 999999) 

一点进一步说明:这种方法的

>>> # select first column 
>>> a[:, 0] 
array([1, 2, 3]) 

>>> # where the first column is 1 
>>> a[:, 0] == 1 
array([ True, False, False], dtype=bool) 

>>> # added dimension so that it correctly broadcasts to the empty mask 
>>> (a[:, 0] == 1)[:, None] 
array([[ True], 
     [False], 
     [False]], dtype=bool) 

>>> # create the final mask 
>>> np.zeros(a.shape, bool) | (a[:, 0] == 1)[:, None] 
array([[ True, True, True], 
     [False, False, False], 
     [False, False, False]], dtype=bool) 

另一个优点是,它不需要使用昂贵的潜在乘法或np.repeat所以它应该是相当快的。