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 entfernen 3,4,7
aus a
. Ich weiß nur den Index der Werte ( index=[2,3,6]
).
Use numpy.delete () - Gibt ein neues Array mit Unterarrays entlang einer gelöschten Achse zurück
numpy.delete(a, index)
Für Ihre spezielle 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ückgegeben wird, da Array-Skalare ähnlich wie Zeichenfolgen in Python unveränderlich sind. Jedes Mal, wenn eine Änderung daran vorgenommen wird, wird ein neues Objekt erstellt. Dh um die delete()
Dokumente zu zitieren :
"Eine Kopie von arr mit den durch obj angegebenen Elementen wurde entfernt. Beachten Sie, dass das Löschen nicht an Ort und Stelle erfolgt ..."
Wenn der von mir veröffentlichte Code ausgegeben wurde, ist dies das Ergebnis der Ausführung des Codes.
Es gibt eine eingebaute Numpy-Funktion, die dabei hilft.
quelle
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
Ein Numpy-Array ist unveränderlich , dh Sie können ein Element technisch nicht daraus löschen. Sie können jedoch ein neues Array ohne die nicht gewünschten Werte erstellen:
quelle
a[0]=1
Wirda
an Ort und Stelle geändert . Die Größe kann jedoch nicht geändert werden.So löschen Sie nach Wert:
quelle
Da ich keine numpy Person bin, habe ich eine Aufnahme gemacht mit:
Nach meinen Tests übertrifft dies
numpy.delete()
. Ich weiß nicht, warum das der Fall sein würde, vielleicht aufgrund der geringen Größe des ursprünglichen Arrays?Das ist ein ziemlich bedeutender Unterschied (in die entgegengesetzte Richtung zu dem, was ich erwartet hatte). Hat jemand eine Idee, warum dies der Fall sein würde?
Noch seltsamer ist es,
numpy.delete()
eine Liste zu übergeben, die schlechter ist, als die Liste zu durchlaufen und ihr einzelne Indizes zu geben.Bearbeiten: Es scheint mit der Größe des Arrays zu tun zu haben. Ist bei großen Arrays
numpy.delete()
deutlich schneller.Natürlich ist das alles ziemlich irrelevant, da Sie immer auf Klarheit achten und vermeiden sollten, das Rad neu zu erfinden, aber ich fand es ein wenig interessant, also dachte ich, ich würde es hier lassen.
quelle
a = delte_stuff(a)
in Ihrer ersten Iteration, diea
mit jeder Iteration kleiner wird. Wenn Sie die Inbuild-Funktion verwenden, speichern Sie den Wert nicht zurück in a, wodurch a in der Originalgröße bleibt! Außerdem können Sie Ihre Funktion drastisch beschleunigen, wenn Sie einen Satz erstellenindex
und prüfen, ob ein Element gelöscht werden soll oder nicht. Wenn ich beide Dinge behebe, bekomme ich für 10.000 Elemente: 6,22 ms pro Schleife mit Ihrer Funktion, 4,48 ms fürnumpy.delete
, was ungefähr das ist, was Sie erwarten würden.np.array(list(range(x)))
Verwendungnp.arange(x)
und zum Erstellen des Index können Sie auch verwendennp.s_[::2]
.Wenn Sie den Index nicht kennen, können Sie ihn nicht verwenden
logical_and
quelle
Die Verwendung
np.delete
ist der schnellste Weg, wenn wir die Indizes der Elemente kennen, die wir entfernen möchten. Der Vollständigkeit halber möchte ich jedoch eine andere Möglichkeit zum "Entfernen" von Array-Elementen mithilfe einer Booleschen Maske hinzufügen, die mit Hilfe von erstellt wurdenp.isin
. Mit dieser Methode können wir die Elemente entfernen, indem wir sie direkt oder anhand ihrer Indizes angeben:Durch Indizes entfernen :
Nach Elementen entfernen (vergessen Sie nicht, das Original
a
neu zu erstellen, da es in der vorherigen Zeile neu geschrieben wurde):quelle
Entfernen Sie einen bestimmten Index (ich habe 16 und 21 aus der Matrix entfernt)
Ausgabe:
quelle
Sie können auch Sets verwenden:
quelle