2016-11-30 1 views
0

Я хочу сделать что-то похожее на то, что было задано здесь NumPy array, change the values that are NOT in a list of indices, но не совсем то же самое.Извлечь элементы из массива numpy, которые не входят в список индексов

Рассмотрим numpy массив:

> a = np.array([0.2, 5.6, 88, 12, 1.3, 6, 8.9]) 

Я знаю, что я могу получить доступ к его элементам с помощью списка индексов, как:

> indxs = [1, 2, 5] 
> a[indxs] 
array([ 5.6, 88. , 6. ]) 

Но мне также нужно получить доступ к этим элементам, которые не в списке indxs. Наивно, это:

> a[not in indxs] 
> array([0.2, 12, 1.3, 8.9]) 

Каков правильный способ сделать это?

ответ

1
In [170]: a = np.array([0.2, 5.6, 88, 12, 1.3, 6, 8.9]) 
In [171]: idx=[1,2,5] 
In [172]: a[idx] 
Out[172]: array([ 5.6, 88. , 6. ]) 
In [173]: np.delete(a,idx) 
Out[173]: array([ 0.2, 12. , 1.3, 8.9]) 

delete является более общим, чем вам действительно нужно, используя различные стратегии в зависимости от входных сигналов. Я думаю, в этом случае он использует подход boolean mask (тайминги должны быть похожими).

In [175]: mask=np.ones_like(a, bool) 
In [176]: mask 
Out[176]: array([ True, True, True, True, True, True, True], dtype=bool) 
In [177]: mask[idx]=False 
In [178]: mask 
Out[178]: array([ True, False, False, True, True, False, True], dtype=bool) 
In [179]: a[mask] 
Out[179]: array([ 0.2, 12. , 1.3, 8.9]) 
+0

Я выбираю этот ответ, потому что он выглядит более простым. Спасибо вам всем! – Gabriel

2

Один из способов заключаются в использовании булевой маски и просто инвертировать индексы ложными:

mask = np.ones(a.size, dtype=bool) 
mask[indxs] = False 
a[mask] 
1

Один подход с np.in1d создать маску из них из indxs настоящего, а затем перевернув его и индексирование входа массив с ним для требуемого выхода -

a[~np.in1d(np.arange(a.size),indxs)] 
1

Вы можете использовать функцию перечислить, за исключением индексов:

[x for i, x in enumerate(a) if i not in [1, 2, 5] ] 

включая них:

[x for i, x in enumerate(a) if i in [1, 2, 5]] 
Смежные вопросы