2016-07-05 2 views
3

У меня есть следующие массивы:маска массива по индексу данного массива из другого

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] 
+1

Посмотрите в 'np.arange' и 'np.in1d'. – 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 [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) 
1
res = [False] * len(a) 
for idx in b: 
    res[idx] = True 

или

[idx in b for idx in range(len(a))] 
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) 
2

Это будет что-то вроде этого :

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

Спасибо. Есть ли способ вернуть «c» с незамасшенными значениями «a» без изменения его размера? – hpnk85

+0

Вы можете добавить к 'c', если' False' 'tuple' как' (False, v) 'и должен быть этим. Отвечает ли это на ваш вопрос? –

Смежные вопросы