293

numpy 配列から特定の要素を削除するにはどうすればよいですか? 私が持っていると言う

import numpy as np

a = np.array([1,2,3,4,5,6,7,8,9])

次に、から削除3,4,7aます。私が知っているのは、値のインデックス ( index=[2,3,6]) だけです。

4

12 に答える 12

383

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のコピー。削除はインプレースで行われないことに注意してください...」

投稿したコードに出力がある場合、それはコードを実行した結果です。

于 2012-06-12T11:58:06.000 に答える
44

Numpy 配列はimmutableです。つまり、技術的に項目を削除することはできません。ただし、次のように、不要な値なしで新しい配列を作成できます。

b = np.delete(a, [2,3,6])
于 2012-06-12T12:03:02.130 に答える
5

派手な人ではないので、次のように撮影しました。

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

明らかに、これはすべてかなり無関係です。常に明確にするために、車輪の再発明を避ける必要がありますが、少し興味深いと思ったので、ここに残しておくことにしました.

于 2012-06-12T12:06:15.027 に答える
-1

不要な部分をフィルタリングします。

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]]
于 2021-10-03T08:50:44.477 に答える