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

Posted

技术标签:

【中文标题】在numpy中使用旋转矩阵有效地旋转一组点【英文标题】:Efficiently rotate a set of points with a rotation matrix in numpy 【发布时间】:2012-08-22 07:36:38 【问题描述】:

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

for n in xrange(N):
    A[n,:] = dot(R, A[n,:]) 

有没有办法通过本机 numpy 调用对其进行矢量化?如果重要的话,N 大约是几千。

【问题讨论】:

【参考方案1】:

在 Aapo Kyrola 的(正确)答案中添加了一些小的更新/澄清点。首先,使用最近添加的矩阵乘法运算符@可以稍微简化矩阵乘法的语法:

A = A @ R.T

此外,您可以通过在乘法之前对A 进行转置,然后转置结果,以标准形式(首先是旋转矩阵)安排转换:

A = (R @ A.T).T

您可以通过以下断言检查两种形式的转换是否产生相同的结果:

np.testing.assert_array_equal((R @ A.T).T, A @ R.T)

【讨论】:

【参考方案2】:

您可以将 A 与旋转矩阵的转置相乘:

A = dot(A, R.T)

【讨论】:

以上是关于在numpy中使用旋转矩阵有效地旋转一组点的主要内容,如果未能解决你的问题,请参考以下文章

基于ICP算法计算点集之间的变换矩阵(旋转平移)

在变换中缩放和旋转矩阵?

OpenCV从仿射矩阵得到旋转量平移量缩放量

OpenCV从仿射矩阵得到旋转量平移量缩放量

3d 矩阵旋转 - 对象奇怪地旋转

罗德里格斯相对于向量的一组点的旋转