2016-11-30 16 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]) 

これを行う正しい方法は何ですか。

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

答えて

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

一つの方法は、falseにブールマスクを使用して、ちょうどインデックスを反転させることです所望の出力のためにそれを配列 -

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

一つはnp.in1dとのアプローチは、それを反転して入力をインデックス、その後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]] 
関連する問題