假设我有以下numpy的数组:掩模在一列中根据值的2D阵列numpy的
a = [[1, 5, 6],
[2, 4, 1],
[3, 1, 5]]
我想屏蔽所有具有在第一列1
的行。也就是说,我想
[[--, --, --],
[2, 4, 1],
[3, 1, 5]]
这可能使用numpy的屏蔽数组操作呢?如何做到这一点?
谢谢。
假设我有以下numpy的数组:掩模在一列中根据值的2D阵列numpy的
a = [[1, 5, 6],
[2, 4, 1],
[3, 1, 5]]
我想屏蔽所有具有在第一列1
的行。也就是说,我想
[[--, --, --],
[2, 4, 1],
[3, 1, 5]]
这可能使用numpy的屏蔽数组操作呢?如何做到这一点?
谢谢。
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]])
可以通过
mask = numpy.repeat(a[:,0]==1, a.shape[1])
和掩蔽阵列通过创建所需掩模
masked_a = numpy.ma.array(a, mask=numpy.repeat(a[:,0]==1, a.shape[1]))
你可以简单地创建一个空的掩模,然后使用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
所以它应该是相当快的。
感谢您的回复Sven!我对numpy很陌生,并没有意识到重复的方法。将查找它。 – Curious2learn 2011-01-07 17:58:20