wake-up-neo.com

So entfernen Sie bestimmte Elemente in einem numpy-Array

Wie kann ich bestimmte Elemente aus einem numpy-Array entfernen? Sag ich habe

import numpy as np

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

Ich möchte dann 3,4,7 von a entfernen. Alles, was ich weiß, ist der Index der Werte (index=[2,3,6]).

Use numpy.delete () - gibt ein new -Array mit Unterarrays entlang einer Achse zurück

numpy.delete(a, index)

Für Ihre spezifische Frage:

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

Beachten Sie, dass numpy.delete() ein neues Array zurückgibt, da Array-Skalare unveränderlich sind, ähnlich den Zeichenfolgen in Python. Wenn also eine Änderung daran vorgenommen wird, wird ein neues Objekt erstellt. Das heißt, delete()docs zu zitieren:

"Ein copy von arr mit den durch obj angegebenen Elementen wurde entfernt. Beachten Sie, dass Delete nicht an Ort und Stelle auftritt ..."

Wenn der von mir gepostete Code ausgegeben wurde, ist dies das Ergebnis der Ausführung des Codes.

200
Levon

Es gibt eine eingebaute Funktion, die Ihnen dabei hilft.

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])
36
Zong

Ein Numpy-Array ist unveränderlich , was bedeutet, dass Sie ein Element technisch nicht daraus löschen können. Sie können jedoch ein new -Array ohne die gewünschten Werte erstellen, z.

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

Da ich keine nackte Person bin, habe ich eine Chance mit

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

Laut meinen Tests übertrifft dies numpy.delete(). Ich weiß nicht warum das der Fall sein könnte, vielleicht aufgrund der geringen Größe des anfänglichen Arrays?

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

Das ist ein ziemlich großer Unterschied (entgegengesetzt zu dem, was ich erwartet hatte). Hat jemand eine Ahnung, warum dies der Fall ist?

Noch seltsamer ist, dass das Übergeben von numpy.delete() einer Liste schlechter ist als das Durchlaufen der Liste und das Zuordnen einzelner Indizes.

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

Edit: Es scheint sich um die Größe des Arrays zu handeln. Bei großen Arrays ist numpy.delete() deutlich schneller.

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

Natürlich ist das alles ziemlich irrelevant, da man immer auf Klarheit achten und vermeiden sollte, das Rad neu zu erfinden, aber ich fand es ein wenig interessant, also dachte ich, ich würde es hier lassen.

6
Gareth Latty

So löschen Sie nach Wert:

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

Wenn Sie den Index nicht kennen, können Sie logical_and nicht verwenden.

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

Bestimmten Index entfernen (ich habe 16 und 21 aus der Matrix entfernt)

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

Ausgabe:

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