web-dev-qa-db-ja.com

NumPy配列、インデックスのリストにない値を変更します

私はnumpy配列を持っています:

a = np.arange(30)

たとえば、ファンシーインデックスを使用して、indices=[2,3,4]の位置にある値を置き換えることができることを知っています。

a[indices] = 999

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

a[ not in indices ] = 888

ありがとうございました!

34

私はこのようなことをするきれいな方法を知りません:

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

もちろん、numpyデータ型を使用したい場合は、dtype=np.bool_を使用できます-出力に違いはありません。本当に好みの問題です。

46
mgilson

1次元配列でのみ機能します。

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

ia = np.indices(a.shape)

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

ちょうど同じような状況を克服し、このように解決しました:

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
4
Alexey Trofimov

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

  1. indicesセットをインデックスのユニバーサルセットから減算すると(aの形状によって異なります)、実装と読み取りが少し難しくなります。
  2. ある種の反復(おそらく、インデックスがソートされているという事実を使用したいので、for- loopが最善の策です)。
  3. 新しい値で満たされた新しい配列を作成し、古い配列からインデックスを選択的にコピーします。

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