通过从其他数组给出的索引来掩盖数组

时间:2016-07-05 22:47:48

标签: python arrays numpy mask

我有以下数组:

a = [10, 31, 30, 11, 17, 12, 22, 25, 85, 17, 21, 43]
b = [0, 1, 4, 6]

我想基于数组a给出的索引来屏蔽b。这意味着获得:

c = [True, True, False, False, True, False, True, False, False, False, False, False]

4 个答案:

答案 0 :(得分:2)

会是这样的:

do

答案 1 :(得分:2)

In [524]: a=np.array([10, 31, 30, 11, 17, 12, 22, 25, 85, 17, 21, 43])
In [525]: b=np.array([0, 1, 4, 6])

要在c索引处生成一个True的布尔b,只需使用:

In [526]: c=np.zeros(a.shape, bool)
In [527]: c[b]=True

In [528]: c
Out[528]: 
array([ True,  True, False, False,  True, False,  True, False, False,
       False, False, False], dtype=bool)

然后您可以选择a的值:

In [529]: a[c]
Out[529]: array([10, 31, 17, 22])

但你也可以选择b

In [530]: a[b]
Out[530]: array([10, 31, 17, 22])

c更适合删除a[~c]np.delete(a,b)做同样的事情。

生成c的其他数组方法是

np.in1d(np.arange(a.shape[0]),b)
np.any(np.arange(a.shape[0])==b[:,None],0)

由于我只是在另一个问题中讨论掩码数组,我可以在这里做同样的事情:

In [542]: np.ma.MaskedArray(a,c)
Out[542]: 
masked_array(data = [-- -- 30 11 -- 12 -- 25 85 17 21 43],
             mask = [ True  True False False  True False  True False False False False False],
       fill_value = 999999)

答案 2 :(得分:1)

res = [False] * len(a)
for idx in b:
    res[idx] = True

[idx in b for idx in range(len(a))]

答案 3 :(得分:1)

对使用np.in1d np.arange创建的新数组使用a

>>> a = [10, 31, 30, 11, 17, 12, 22, 25, 85, 17, 21, 43]
>>> b = [0, 1, 4, 6]
>>> a = np.array(a)
>>> b = np.array(b)
>>> np.in1d(np.arange(len(a)), b)
array([ True,  True, False, False,  True, False,  True, False, False,
       False, False, False], dtype=bool)