Ich habe zwei numplige Reihen von ganzen Zahlen, beide von mehreren hundert Millionen. Innerhalb jedes Arrays sind die Werte eindeutig und jedes ist zunächst unsortiert.
Ich hätte gerne die Indizes, die ihre sortierte Schnittmenge ergeben. Zum Beispiel:
%Vor% Dann ist der sortierte Schnittpunkt dieser Werte [4, 5, 11]
, und deshalb wollen wir die Indizes, die jedes von x und y in dieses Array drehen, so dass wir es zurückgeben wollen:
seit dann x[mx] == y[my] == np.intersect1d(x, y)
Die einzige Lösung, die wir bisher haben, beinhaltet drei verschiedene Argumente, also scheint es unwahrscheinlich, dass sie optimal ist.
Jeder Wert repräsentiert eine Galaxie, falls das das Problem mehr Spaß macht.
Hier ist eine Option, die auf der Implementierung von intersect1d
basiert, was ziemlich einfach ist. Es erfordert einen Aufruf von argsort
.
Der zugegebenermaßen simple Test besteht.
%Vor% Edit: "Anmerkung" Kommentar war verwirrend (Use ...
als Sprache Ellipse, vergessen, es war auch ein Python-Operator).
Sie können auch np.searchsorted
verwenden, also -
Beispiellauf -
%Vor%Für eine reine numplige Lösung könnten Sie so etwas tun:
Verwenden Sie np.unique
, um die eindeutigen Werte und die entsprechenden Indizes zu erhalten x
und y
getrennt:
Suchen Sie den Schnittpunkt der eindeutigen Werte mit np.intersect1d
:
Verwenden Sie schließlich np.in1d
, um nur auszuwählen die Indizes, die eindeutigen Werten in x
oder y
entsprechen, die sich auch im Schnittpunkt von x
und y
befinden:
Um all das zu einer einzigen Funktion zusammenzufassen:
%Vor%Zum Beispiel:
%Vor%Geschwindigkeitstest:
%Vor% Ich habe zunächst übersehen, dass in Ihrem Fall sowohl x
als auch y
nur eindeutige Werte enthalten. Wenn man das berücksichtigt, ist es möglich, etwas besser zu machen, indem man eine indirekte Sortierung verwendet:
Hier ist ein realistischerer Testfall, wobei x
und y
beide eindeutige (aber teilweise überlappende) Werte enthalten:
Die Lösung von @Divakar ist in Bezug auf die Leistung sehr ähnlich:
%Vor%Vielleicht funktioniert eine reine Python-Lösung mit einem Diktat für Sie:
%Vor%Tags und Links python optimization numpy sorting set-intersection