Ich habe ein Array von N
Punkten in d
Dimensionen (N, d)
und ich möchte ein neues Array aller Verschiebungsvektoren für jedes Paar (N choose 2, d)
erstellen. Wenn ich nur die Größe dieser Vektoren möchte, kann ich pdist
verwenden. von scipy.spatial.distance
.
Es wäre toll, wenn ich es einfach machen könnte
%Vor% aber die Funktion metric
muss einen Skalar ( ValueError: setting an array element with a sequence.
)
Meine Lösung ist np.triu_indices
:
Das ist etwa 20-30 mal langsamer als die Verwendung von pdist
(ich vergleiche die Größe von displacements
, obwohl das nicht der zeitraubende Teil ist, von dem ich annehme, dass er das obere Dreieck macht und läuft Phantasie Indizierung).
Gerade wäre
%Vor% aber ich bezweifle, dass es schnell ist. Eigentlich sagt %timeit
:
Für 3 Punkte:
%Vor%Aber schon für 27 Punkte:
%Vor%Wie viele Punkte sprechen wir hier?
Eine andere Möglichkeit so etwas wie
%Vor%Dies "verschiebt" das Array einfach über alle Dimensionen gegen sich selbst und führt in jedem Schritt eine (übertragbare) Subtraktion durch. Beachten Sie, dass keine Wiederholung berücksichtigt wird und keine gleichwertigen Paare (z. B. Punkt1 - Punkt1).
Diese Funktion arbeitet immer noch gut im Bereich 1000 Punkte mit 31.3ms
, wohingegen pdist
immer noch schneller ist mit 20.7 ms
und das Listenverständnis nimmt den dritten Platz mit 1.23 s
.
Wenn Sie das vollständige kartesische Produkt von Differenzen berechnen, das resultierende 2D-Array abflachen und eigene Indizes erstellen, um das obere Dreieck zu extrahieren, können Sie es "nur" 6x langsamer als pdist
:
Sie können Ihre Lösung auch beschleunigen, indem Sie die Indizes selbst erstellen und Take anstatt einer ausgefallenen Indexierung verwenden:
%Vor%