坐标时间序列与旋转矩阵时间序列的点积
Dot product of a time series of co-ordinates with a time series of rotation matrices
我有一个形状为 (t,3)
的航天器坐标时间序列,以及一个形状为 (3,3,t)
的旋转矩阵时间序列,其中 t 是时间序列的长度。我想在每个时间 t 找到坐标与每个时间 t 的旋转矩阵的点积,这样我就得到了一个数组shape (t,3)
即旋转后的坐标。
我可以通过编写以下代码在 for 循环中实现此目的:
new_coords = np.zeros_like(input_coords)
for Ci, Vi in enumerate(input_coords):
new_coords[Ci,:] = np.tensordot(Vi, rotation[:,:,Ci], axes = 1)
如何用一行 Python 替换这个 for 循环?我已经尝试了 np.tensordot
的各种排列但没有成功。
可以使用np.einsum
-
np.einsum('ijk,ki->kj',rotation, input_coords)
通用格式的形状 -
rotation : 3 x 3 x N
input_coords : N x 3
这里应用了两个注意事项 -
rotation
的第一个(轴)与 input_coords
的最后一个(轴)的和减少。
- 保持
rotation
的最后一个和 input_coords
的第一个对齐。这与在嵌套循环中使用 Ci
的方式一致。
我有一个形状为 (t,3)
的航天器坐标时间序列,以及一个形状为 (3,3,t)
的旋转矩阵时间序列,其中 t 是时间序列的长度。我想在每个时间 t 找到坐标与每个时间 t 的旋转矩阵的点积,这样我就得到了一个数组shape (t,3)
即旋转后的坐标。
我可以通过编写以下代码在 for 循环中实现此目的:
new_coords = np.zeros_like(input_coords)
for Ci, Vi in enumerate(input_coords):
new_coords[Ci,:] = np.tensordot(Vi, rotation[:,:,Ci], axes = 1)
如何用一行 Python 替换这个 for 循环?我已经尝试了 np.tensordot
的各种排列但没有成功。
可以使用np.einsum
-
np.einsum('ijk,ki->kj',rotation, input_coords)
通用格式的形状 -
rotation : 3 x 3 x N
input_coords : N x 3
这里应用了两个注意事项 -
rotation
的第一个(轴)与input_coords
的最后一个(轴)的和减少。- 保持
rotation
的最后一个和input_coords
的第一个对齐。这与在嵌套循环中使用Ci
的方式一致。