Entfernen von Elementen aus einem array in ein anderes array
Sagen, ich habe diese 2D-arrays A und B.
Wie kann ich das entfernen von Elementen aus A in B. (Komplement in der Mengenlehre: A-B)
A=np.asarray([[1,1,1], [1,1,2], [1,1,3], [1,1,4]])
B=np.asarray([[0,0,0], [1,0,2], [1,0,3], [1,0,4], [1,1,0], [1,1,1], [1,1,4]])
#output = [[1,1,2], [1,1,3]]
Um genauer zu sein, ich möchte so etwas wie dies tun.
data = some numpy array
label = some numpy array
A = np.argwhere(label==0) #[[1 1 1], [1 1 2], [1 1 3], [1 1 4]]
B = np.argwhere(data>1.5) #[[0 0 0], [1 0 2], [1 0 3], [1 0 4], [1 1 0], [1 1 1], [1 1 4]]
out = np.argwhere(label==0 and data>1.5) #[[1 1 2], [1 1 3]]
nicht == wird funktionieren, ich bin nur raten, ich weiß nicht viel über numpy arrays, aus meinem python-Konsole habe ich diese
Eine einfache, nicht-numpy Lösung -
>>>[1,1,1]==[1,1,1] >>>True
Eine einfache, nicht-numpy Lösung -
[i for i in A for j in B if i==j]
InformationsquelleAutor Jee Seok Yoon | 2016-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf
diese Lösung
zuSuchen Sie die Zeile, Indizes, mehrere Werte in ein numpy-array
, hier ist ein NumPy-basierte Lösung, mit weniger Speicherbedarf und könnte vorteilhaft sein, wenn die Arbeit mit großen arrays -Probe Gefahren -
Runtime test auf großen arrays -
Timings mit
broadcasting
basierte Lösungen -Timing mit weniger Hauptspeicher-basierten Lösung -
Weitere Leistungssteigerung
in1d_approach
reduziert jede Zeile betrachtet man jede Zeile als eine Indizierung Tupel. Wir können das gleiche tun, ein bisschen mehr effizient durch die Einführung der matrix-Multiplikation mitnp.dot
wie soLassen Sie uns testen Sie es gegen die Vorherige auf viel größere arrays -
Nun, einfach, weil weniger Genauigkeit Datentypen belegen würde weniger Speicher im Hinblick auf Ihre binären bits und so entstehen weniger Speicher-Belegung und dass in den meisten Fällen übersetzt, um eine schnellere Verarbeitung als die Verarbeitung weniger Daten, da eine geringe Anzahl der binären bits sind zur Darstellung der einzelnen Nummer. Du musst Bedenken, dass auf der untersten Ebene, CPUs verarbeiten von binären Daten. Die Hoffnung, dass Sinn gemacht!
Ich Frage, warum ist in1d_approach(A,B) langsamer als in1d_dot_approach(A, B) beim Umgang mit Gleitkomma, aber schneller bei integer? Ist es nur, wie numpy gebaut wurde? Warum matrix-Multiplikation ausführen, besser mit floating point/ schlechter mit ganzen zahlen (im Vergleich zu anderen Methoden)?
InformationsquelleAutor Divakar
Hier ist ein Numpythonic Ansatz mit Rundfunk:
Hier ist eine timeit mit anderen Antwort:
Gut, wenn Sie auf der Suche nach einem schnelleren Weg, sollten Sie auf der Suche nach Möglichkeiten, die Verringerung der Anzahl der Vergleiche. In diesem Fall (ohne Berücksichtigung der Reihenfolge) generieren Sie eine eindeutige Nummer, die aus Ihren Zeilen und vergleichen Sie die zahlen, die getan werden kann, mit der Summe der Elemente, die Kraft der zwei.
Hier ist der benchmark mit Divakar ist in1d Ansatz:
Können Sie
np.diff
zu erhalten, die eine Bestellung unabhängiges Ergebnis:Benchmark mit Divakar setup:
Timing mit größeren arrays (Divakar die Lösung ist etwas schneller):
Eigentlich mit
equality
besser sein könnte, auf die Leistung :A[~((A[:,None,:] == B).all(-1)).any(1)]
.Große Lösung 🙂
In der Tat, das ist Nett!
Schätzen Sie die updates, vielen Dank!
InformationsquelleAutor Kasrâmvd
gibt es eine einfache Lösung, mit list comprehension,
Ergebnis
Liste Verständnis, es ist nicht das entfernen der Elemente aus dem array, Es ist nur eine Verlagerung,
wenn Sie möchten, entfernen Sie die Elemente, die diese Methode verwenden,
InformationsquelleAutor Rahul K P
Wenn Sie es tun möchten die numpy Weg,
Als @Rahul vorgeschlagen, für eine nicht numpy einfache Lösung,
Vielen Dank für das heads-up. Aktualisiert.
InformationsquelleAutor R. S. Nikhil Krishna
Anderen nicht-numpy Lösung:
InformationsquelleAutor liuyihe