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

Hoo*_*ked 18 python numpy rotation vectorization

我具有存储在numpy的阵列的3D点的列表A具有形状(N,3)和旋转矩阵R与形状(3,3).我想计算的点积R.x每个点xA原地.天真我能做到这一点:

for n in xrange(N):
    A[n,:] = dot(R, A[n,:]) 
Run Code Online (Sandbox Code Playgroud)

有没有办法用本地numpy调用来对此进行矢量化?如果重要的话,N就是几千的订单.

小智 25

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

A = dot(A, R.T)
Run Code Online (Sandbox Code Playgroud)


tel*_*tel 9

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

A = A @ R.T
Run Code Online (Sandbox Code Playgroud)

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

A = (R @ A.T).T
Run Code Online (Sandbox Code Playgroud)

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

np.testing.assert_array_equal((R @ A.T).T, A @ R.T)
Run Code Online (Sandbox Code Playgroud)