np.tensordot 用于点云的旋转?
np.tensordot for rotation of point clouds?
绕原点旋转是一个矩阵乘积,可以用numpy的点函数来完成,
import numpy as np
points = np.random.rand(100,3) # 100 X, Y, Z tuples. shape = (100,3)
rotation = np.identity(3) # null rotation for example
out = np.empty(points.shape)
for idx, point in enumerate(points):
out[idx,:] = np.dot(rotation, point)
这涉及到一个for循环,或者可以使用numpy tile进行矢量化。我认为有一个涉及 np.tensordot 的实现,但该功能对我来说是巫术。这可能吗?
有几种方法可以做到这一点。使用 np.matmul
你可以:
out = np.matmul(rotation, points[:, :, np.newaxis])[:, :, 0]
或者,等效地,如果您使用的是 Python 3.5 或更高版本:
out = (rotation @ points[:, :, np.newaxis])[:, :, 0]
另一种方法是 np.einsum
:
out = np.einsum('ij,nj->ni', rotation, points)
最后,按照你的建议,你也可以使用np.tensordot
:
out = np.tensordot(points, rotation, axes=[1, 1])
请注意,在这种情况下,points
是第一个参数,rotation
是第二个参数,否则输出的维度将反转。
绕原点旋转是一个矩阵乘积,可以用numpy的点函数来完成,
import numpy as np
points = np.random.rand(100,3) # 100 X, Y, Z tuples. shape = (100,3)
rotation = np.identity(3) # null rotation for example
out = np.empty(points.shape)
for idx, point in enumerate(points):
out[idx,:] = np.dot(rotation, point)
这涉及到一个for循环,或者可以使用numpy tile进行矢量化。我认为有一个涉及 np.tensordot 的实现,但该功能对我来说是巫术。这可能吗?
有几种方法可以做到这一点。使用 np.matmul
你可以:
out = np.matmul(rotation, points[:, :, np.newaxis])[:, :, 0]
或者,等效地,如果您使用的是 Python 3.5 或更高版本:
out = (rotation @ points[:, :, np.newaxis])[:, :, 0]
另一种方法是 np.einsum
:
out = np.einsum('ij,nj->ni', rotation, points)
最后,按照你的建议,你也可以使用np.tensordot
:
out = np.tensordot(points, rotation, axes=[1, 1])
请注意,在这种情况下,points
是第一个参数,rotation
是第二个参数,否则输出的维度将反转。