2016-11-26 2 views
2

Ich habe eine Reihe von (n) geometrischen Formen, die durch eine feste Anzahl (p) von 2D-Punkten definiert sind. Diese Formen sind unabhängig, aber aus Gründen der Effizienz habe ich die Zeit in einem einzigen Array gespeichert. Das Skalieren oder Übersetzen dieser Formen ist einfach, aber ich möchte sie drehen und bin mir nicht sicher, wie das geht. Ich vermute, np.tensordot ist mein Freund, aber ich kann den Weg nicht finden, es richtig zu benutzen.Mehrere individuelle 2D-Rotation auf einmal

n = 100 # Number of shape 
p = 4 # Points per shape 
P = np.random.uniform(0, 1, (n, p, 2)) 

# Scaling 
S = 0.5*np.ones(n) 
P *= S 

# Translating 
T = np.random.uniform(0, 1, (n, 1, 2)) 
P += T 

# Rotating 
A = np.random.uniform(0, 2*np.pi, n) 
cosA, sinA = np.cos(A), np.sin(A) 

R = np.empty((n,2,2)) 
R[:,0,0] = cosA 
R[:,1,0] = sinA 
R[:,0,1] = -sinA 
R[:,1,1] = cosA 

np.tensordot(P, R, axes=???) 
+0

Was die Form des Ausgangsarray sein würde? – Divakar

+0

Die Form sollte die gleiche sein wie P (jeder Punkt von P wird gedreht) –

Antwort

2

Es scheint, dass Sie die erste Achse zwischen den beiden Anordnungen halten - und PR ausgerichtet und sum-reducing je einem von den übrigen Achsen von den Eingabefeldern. Also können wir np.einsum verwenden, da es uns die Achsenausrichtungskriterien erlaubt.

Sie verwenden die letzte Achse von P für die Summenreduktion. Nun, je nachdem, welche Achse von R Sie mit sum-reduction für die Rotation Berechnung verlieren, eine davon soll die Arbeit machen -

np.einsum('ijk,ilk->ijl',P,R) # Using last dim of R for sum-reduction 
np.einsum('ijk,ikl->ijl',P,R) # Using second dim of R for sum-reduction 
+0

Danke! Was wäre die geometrische Interpretation zwischen der ersten und letzten Option? –

+0

@NicolasRougier Nun, ich kann Ihnen mit dem Code Teil helfen, nicht sicher über die Geometrie, wie es hier bezieht. Also, ich kann es nicht kommentieren, tut mir leid. – Divakar

+0

Ich werde dann experimentieren. Danke noch einmal. –