在numpy中使用旋转矩阵高效地旋转一组点

25

我有一个存储在numpy数组A中的3D点列表,其形状为(N,3),以及一个形状为(3,3)的旋转矩阵R。我想计算每个点x在原地与R.x进行点积。 Naively我可以这样做:

for n in xrange(N):
    A[n,:] = dot(R, A[n,:]) 
有没有一种使用原生的numpy方法来向量化这个操作的方式?如果有关系的话,N的数量级大约是几千。
2个回答

37

你可以用旋转矩阵的转置乘以A:

A = dot(A, R.T)

14

针对Aapo Kyrola的(正确)答案,有些小更新/澄清需要补充说明。首先,矩阵乘法的语法可以通过最近添加的矩阵乘法运算符@略微简化:

A = A @ R.T

此外,您可以通过在乘法之前对A进行转置,然后转置结果来将变换排列成标准形式(先旋转矩阵):
A = (R @ A.T).T

您可以通过以下断言检查两种转换形式是否产生相同的结果:
np.testing.assert_array_equal((R @ A.T).T, A @ R.T)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接