numpy 配列から特定の要素を削除するにはどうすればよいですか? 私が持っていると言う
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
次に、から削除3,4,7
しa
ます。私が知っているのは、値のインデックス ( index=[2,3,6]
) だけです。
numpy.delete()を使用-軸に沿ったサブ配列が削除された新しい配列を返します
numpy.delete(a, index)
特定の質問について:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`
Python の文字列と同様に、配列スカラーnumpy.delete()
は不変であるため、新しい配列を返すことに注意してください。変更が加えられるたびに、新しいオブジェクトが作成されます。つまり、ドキュメントを引用するには:delete()
「obj で指定された要素が削除された arrのコピー。削除はインプレースで行われないことに注意してください...」
投稿したコードに出力がある場合、それはコードを実行した結果です。
Numpy 配列はimmutableです。つまり、技術的に項目を削除することはできません。ただし、次のように、不要な値なしで新しい配列を作成できます。
b = np.delete(a, [2,3,6])
派手な人ではないので、次のように撮影しました。
>>> import numpy as np
>>> import itertools
>>>
>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> index=[2,3,6]
>>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))
>>> a
array([1, 2, 5, 6, 8, 9])
私のテストによると、これはnumpy.delete()
. おそらく初期配列のサイズが小さいため、なぜそうなるのかわかりませんか?
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
100000 loops, best of 3: 12.9 usec per loop
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)"
10000 loops, best of 3: 108 usec per loop
これはかなり大きな違いです (私が予想していたものとは逆の方向です)。
さらに奇妙なことにnumpy.delete()
、リストを渡すと、リストをループして単一のインデックスを与えるよりもパフォーマンスが低下します。
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)"
10000 loops, best of 3: 33.8 usec per loop
編集:配列のサイズに関係しているようです。大規模な配列を使用するnumpy.delete()
と、大幅に高速になります。
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
10 loops, best of 3: 200 msec per loop
python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)"
1000 loops, best of 3: 1.68 msec per loop
明らかに、これはすべてかなり無関係です。常に明確にするために、車輪の再発明を避ける必要がありますが、少し興味深いと思ったので、ここに残しておくことにしました.
不要な部分をフィルタリングします。
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
a = a[(a!=3)&(a!=4)&(a!=7)]
削除するインデックスのリストがある場合:
to_be_removed_inds = [2,3,6]
a = np.array([1,2,3,4,5,6,7,8,9])
a = a[[x for x in range(len(a)) if x not in to_be_removed]]