Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向量数组通过旋转矩阵数组的旋转_Python_Numpy_Scipy_Vectorization - Fatal编程技术网

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代码(当然是玩具示例),也许有关如何计算旋转矩阵矢量化的问题对某些人有用: