web-dev-qa-db-ja.com

派手な配列から特定の要素を削除する方法

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

import numpy as np

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

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

Use 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のコピー削除はその場で行われないことに注意してください..."

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

221
Levon

それを手助けするための派手な組み込み関数があります。

import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.array([3,4,7])
>>> c = np.setdiff1d(a,b)
>>> c
array([1, 2, 5, 6, 8, 9])
39
Zong

Numpy配列は 不変 です。つまり、技術的にそこから項目を削除することはできません。ただし、次のように、不要な値を指定せずにnew配列を作成することもできます。

b = np.delete(a, [2,3,6])
31
Digitalex

でたらめな人ではないので、私は次のようにして写真を撮りました。

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

あなたはいつも明快さのために行って、そして車輪を再発明することを避けるべきであるので、明らかに、これは全く無関係です、しかし私はそれを少しおもしろいと思ったので、私はそれをここに残すと思いました。

6
Gareth Latty

値で削除するには:

modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
5
Prakhar Pandey

あなたがインデックスを知らないなら、あなたはlogical_andを使うことができません

x = 10*np.random.randn(1,100)
low = 5
high = 27
x[0,np.logical_and(x[0,:]>low,x[0,:]<high)]
0
idnavid

特定のインデックスを削除します(iはマトリックスから16と21を削除しました)

import numpy as np
mat = np.arange(12,26)
a = [4,9]
del_map = np.delete(mat, a)
del_map.reshape(3,4)

出力:

array([[12, 13, 14, 15],
      [17, 18, 19, 20],
      [22, 23, 24, 25]])
0
Raja Ahsan Zeb