2016-11-30 75 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更普遍比你真正需要的,它可以根據輸入不同的策略。我認爲在這種情況下它使用布爾掩模方法(時間應該類似)。

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