Python 向量数组通过旋转矩阵数组的旋转
如果我们有一个Python 向量数组通过旋转矩阵数组的旋转,python,numpy,scipy,vectorization,Python,Numpy,Scipy,Vectorization,如果我们有一个3x3旋转矩阵R,它可以乘以v,一个3xn数组-一个N列向量数组-以产生一个新的3xn旋转向量数组,如下所示: v_rotated = R.dot(v) 现在假设我们有一个nxmx3数组,N乘以M向量,我想用N不同的3x3旋转矩阵来旋转它(每行向量一个旋转矩阵)。这对于循环来说很简单,但是是否有一种更快、更紧凑(矢量化)的方法,例如使用numpy的dot或tensorproduct 循环实现的示例代码: from numpy import cos, sin, array, pi,
3x3
旋转矩阵R
,它可以乘以v
,一个3xn
数组-一个N
列向量数组-以产生一个新的3xn
旋转向量数组,如下所示:
v_rotated = R.dot(v)
现在假设我们有一个nxmx3
数组,N
乘以M
向量,我想用N
不同的3x3
旋转矩阵来旋转它(每行向量一个旋转矩阵)。这对于循环来说很简单,但是是否有一种更快、更紧凑(矢量化)的方法,例如使用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
如果您已经实现了,请共享loopy代码,以便我们可以检查任何建议的解决方案?@Divakar添加了loopy代码(当然是玩具示例),也许有关如何计算旋转矩阵矢量化的问题对某些人有用: