2013-06-05 13 views
18

インデックスのリストにない値を変更numpy配列のように:numpyの配列、私が持っている

a = np.arange(30) 

私はインスタンスファンシーインデックス用に使用して位置indices=[2,3,4]に位置値を置き換えることができることを知っている:

a[indices] = 999 

しかし、indicesにない位置の値を置き換えるにはどうすればよいですか?以下のようなものでしょうか?

a[ not in indices ] = 888 

ありがとうございます!

答えて

22

私はこのような何かを行うにクリーンな方法を知っていません:あなたはnumpyのデータ型を使用することを好む場合、あなたはdtype=np.bool_を使用することができ、もちろん

mask = np.ones(a.shape,dtype=bool) #np.ones_like(a,dtype=bool) 
mask[indices] = False 
a[~mask] = 999 
a[mask] = 888 

を - 出力に違いはありません。それは本当に好みの問題です。

+4

なぜ 'np.ones_like' – jamylak

+0

@jamylakを使用しないで - 私は見て必要なので、 'np.ones_like'のドキュメントをアップしましたが、' np.ones'がどのように働いたかを知っていました;-) – mgilson

+4

最後の数行を 'numpy.where'を1回呼び出すだけで置き換えることができますそれが本当に便利な主なケース)。例えば。 'a = np.where(マスク、888,999)'。 –

3

明らかに、セットのための一般的なnot演算子はありません。選択肢は次のとおりです。

  1. は、インデックスの普遍セット(aの形状に依存する)からあなたindicesセットを差し引くと、それは難しいビットは実装して読み取ることができます。
  2. 何らかの反復(おそらくfor -loopがあなたのインデックスがソートされているという事実を利用したいので、おそらく最善の策です)。
  3. 新しい値で新しい配列を作成し、古いものからインデックスを選択的にコピーします。

    b = np.repeat(888, a.shape) 
    b[indices] = a[indices] 
    
4

のみ1D配列のために働く:

a = np.arange(30) 
indices = [2, 3, 4] 

ia = np.indices(a.shape) 

not_indices = np.setxor1d(ia, indices) 
a[not_indices] = 888 
2

ちょうど似たような状況を克服するため、この方法を解く:

a = np.arange(30) 
indices=[2,3,4] 

a[indices] = 999 

not_in_indices = [x for x in range(len(a)) if x not in indices] 

a[not_in_indices] = 888