如果我们有一个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
的{{1}}或dot
?
循环实现的示例代码:
tensorproduct
答案 0 :(得分: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)
其中l
是N
上的索引,i
和j
是3x3
轮换维度上的索引,k
是M
上的索引。
我将结果与您的结果相符:
>>> print np.allclose(my_rotated_v, your_rotated_v)
True