2014-10-10 10 views
5

Ich habe eine Reihe bekommt, die eine Reihe von Punkten enthält (3D-Vektoren, speziell):Verwenden Sie numpy, um eine Matrix über ein Array von Punkten zu multiplizieren?

pts = np.array([ 
    [1, 1, 1], 
    [2, 2, 2], 
    [3, 3, 3], 
    [4, 4, 4], 
    [5, 5, 5], 
]) 

Und ich würde jeden dieser Punkte durch eine Transformationsmatrix multiplizieren mag:

pts[0] = np.dot(transform_matrix, pts[0]) 
pts[1] = np.dot(transform_matrix, pts[1]) 
… 
pts[n] = np.dot(transform_matrix, pts[n]) 

Wie kann ich das effizient machen?

Antwort

9

Ich finde es hilft first-- die einsum Version zu schreiben, nachdem Sie die Indizes sehen kann man oft erkennen, dass es eine einfachere Version ist. Zum Beispiel von Start

>>> pts = np.random.random((5,3)) 
>>> transform_matrix = np.random.random((3,3)) 
>>> 
>>> pts_brute = pts.copy() 
>>> for i in range(len(pts_brute)): 
...   pts_brute[i] = transform_matrix.dot(pts_brute[i]) 
...  
>>> pts_einsum = np.einsum("ij,kj->ik", pts, transform_matrix) 
>>> np.allclose(pts_brute, pts_einsum) 
True 

Sie können sehen, dies ist einfach

>>> pts_dot = pts.dot(transform_matrix.T) 
>>> np.allclose(pts_brute, pts_dot) 
True 
+0

Super, danke! Auch das ist ein toller Tipp zu'Einsum' - danke. –

3

Matrix-Matrix-Multiplikation kann als „Batch-Modus“ Matrix-Vektor-Multiplikation gedacht werden, wobei jede Spalte in der zweiten Matrix ist einer der Vektoren, der mit dem ersten multipliziert wird, wobei die Ergebnisvektoren die Spalten der resultierenden Matrix sind.

Beachten Sie auch, dass, da (AB) T = B T A T und daher (durch beide Seiten der Umsetzung) ((AB) T) T = AB = (B T A T) T kann man eine ähnliche Aussage über die Reihen der ersten Matrix bildet Batch- wobei (links-) durch die der zweite transponierte Matrix multipliziert, mit dem Ergebnis, wobei die Vektoren Reihen von die Matrix Produkt.

Verwandte Themen