2016-03-30 92 views
2

如果我們有一個3 x 3旋轉矩陣R,它可以被用v相乘,一個3 x N陣列 - 的N列向量的陣列 - 以產生新3 x N陣列的旋轉矢量,如下所示:旋轉向量的陣列的

v_rotated = R.dot(v) 

現在假設我們有一個N x M x 3陣列,NM載體,其欲與N不同3 x 3旋轉矩陣(對於每個向量的「行」一個旋轉矩陣)旋轉。這對於循環來說很簡單,但是有一種更快,更緊湊(矢量化)的方式來完成它,例如,與numpydottensorproduct? for循環實現

示例代碼:

from numpy import cos, sin, array, pi, linspace, random 

# 100 different rotation matrices: 
R = [array([[1, 0, 0], [0, cos(theta), -sin(theta)], [0, sin(theta), cos(theta)]]) for theta in linspace(0, pi, 100)] 
# 100 x 200 random vectors: 
v = random.random((100, 200, 3)) 

# rotate vectors in loop: 
rotated_v = array([R_.dot(v_.T).T for R_, v_ in zip(R, v)]) 
+0

分享,如果你已經實現了,這樣我們就可以回來看看就提出的任何解決方案糊塗的代碼? – Divakar

+0

@Divakar增加了代碼(當然是玩具的例子) – sulkeh

回答

5

我們假設v.shape(N, M, 3)R.shape(N, 3, 3), 可以使用np.einsum

import numpy as np 
rotated_v = np.einsum('lij, lkj->lki', R, v) 

其中lNi和索引j3x3轉動的索引離子尺寸,kM上的索引。

我符合我的結果與你如下:

>>> print np.allclose(my_rotated_v, your_rotated_v) 
True