Effiziente Verfahren zur Berechnung überschneidende Werte zwischen zwei numpy arrays
Ich habe einen Flaschenhals in meinem Programm, die durch Folgendes verursacht:
A = numpy.array([10,4,6,7,1,5,3,4,24,1,1,9,10,10,18])
B = numpy.array([1,4,5,6,7,8,9])
C = numpy.array([i for i in A if i in B])
Das erwartete Ergebnis für C
ist folgende:
C = [4 6 7 1 5 4 1 1 9]
Ist es ein effizienter Weg, dies zu tun Betrieb?
Beachten Sie, dass array - A
enthält sich wiederholende Werte und Sie müssen berücksichtigt werden. Ich war nicht in der Lage zu verwenden, setzen Kreuzung seit der Einnahme der Kreuzung wird es unterlassen, die sich wiederholenden Werte, Rückgabe nur [1,4,5,6,7,9]
.
Beachten Sie auch diese ist nur eine einfache demonstration. Die eigentliche array-Größen können in der Größenordnung von tausenden, die deutlich über einer Millionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
np.in1d
:np.in1d
gibt einen boolean-array, der angibt, ob jeder WertA
erscheint auch inB
. Dieses array kann dann verwendet werden, um index -A
und Rückkehr zu den gemeinsamen Werten.Es ist nicht relevant zu Ihrem Beispiel, aber es ist auch erwähnenswert, dass, wenn
A
undB
jede eindeutige Werte enthalten dannnp.in1d
kann beschleunigt werden, indem die Einstellungassume_unique=True
:Könnten Sie auch interessieren
np.intersect1d
gibt ein array mit den einzigartigen gemeinsamen Werte der beiden arrays (sortiert nach Wert):np.intersect1d
scheint ein bisschen schneller, wennassume_unique
eingestellt istTrue
bei beiden Methoden. Ich bin mir nicht sicher von den genauen Grund, warum, aber es kann sein das es da zu tun hat, weniger Vergleiche.Verwenden
numpy.in1d
:Wenn Sie das Kontrollkästchen nur für die Existenz in
B
(if i in B
), dann Sie natürlich kann verwendenset
für diese. Es spielt keine Rolle, wie viele Vieren gibt es inB
solange es mindestens eine. Natürlich haben Sie Recht, dass Sie nicht verwenden können, zwei Sätze und eine Kreuzung. Aber auch eineset
sollte die performance verbessern, da die Suche Komplexität ist weniger als O(n):Wir können
np.searchsorted
für die Leistung zu steigern, um so mehr für den Fall, wenn das lookup-array muss sortiert einzigartige Werte -Dass
assume_unique
flag macht es für den Allgemeinen Fall und den speziellen Fall derB
unique und sortiert.Probe Gefahren -
Timings zum Vergleich mit anderen Vektorgrafik -
np.in1d
basierte Lösung (aufgeführt in zwei anderen Antworten) auf große arrays für die beiden Fälle -