如果我们有一个3 x 3
旋转矩阵R
,它可以乘以v
,一个3 x N
数组 - 一个N
列向量的数组 - 以产生一个新的旋转向量3 x N
数组,如下所示:
v_rotated = R.dot(v)
现在假设我们有一个N x M x 3
数组,N
倍M
向量,我想用N
不同的3 x 3
旋转矩阵(每个"行"向量一个旋转矩阵(旋转它。这很容易用循环来完成,但是有没有更快,更紧凑(矢量化(的方法来实现它,例如使用numpy
的dot
或tensorproduct
?
循环实现的示例代码:
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)])
假设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)
其中l
是N
上的索引,i
和j
是旋转维度上的索引3x3
k
是M
上的索引。
我与您的结果匹配如下:
>>> print np.allclose(my_rotated_v, your_rotated_v)
True