2016-07-05 52 views
3

我有以下陣列給定的索引面膜的數組:通過從其它陣列

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

欲基於由陣列b給定的索引,以掩蓋a。這意味着獲得:

c = [True, True, False, False, True, False, True, False, False, False, False, False] 
+1

查找到'np.arange'和'np.in1d' funcs。 – Divakar

回答

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是在b指數真,只需使用:

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

但你:

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值也可以選擇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) 
1
res = [False] * len(a) 
for idx in b: 
    res[idx] = True 

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

a長度與np.arange創建一個新的陣列上使用np.in1d

>>> 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) 
2

它會是這樣的:

c = [] 
for i, v in enumerate(a): 
    mask = True if i in b else False 
    c.append(mask) 
+0

謝謝。有沒有一種方法可以在不改變其大小的情況下返回'c'的未掩碼值? – hpnk85

+0

如果'False''' tuple' like'(False,v)',你可以追加'c'並且應該是。這是否回答你的問題? –