Paarweise Verschiebungsvektoren zwischen Punktmengen

8

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. )

zurückgeben

Meine Lösung ist np.triu_indices :

zu verwenden %Vor%

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).

    
askewchan 13.03.2014, 20:40
quelle

2 Antworten

2

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 .

    
loli 13.03.2014, 21:08
quelle
1

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 :

erhalten %Vor%

Sie können Ihre Lösung auch beschleunigen, indem Sie die Indizes selbst erstellen und Take anstatt einer ausgefallenen Indexierung verwenden:

%Vor%     
Jaime 13.03.2014 22:12
quelle

Tags und Links