【发布时间】:2020-09-03 09:02:05
【问题描述】:
我正在尝试以几何方式旋转 NumPy 中的向量数组。首先我生成一个网格的坐标向量。
width = 128
height = 128
x_axis = np.linspace(-1, 1, width)
y_axis = np.linspace(-1, 1, height)
x, y = np.meshgrid(x_axis, y_axis)
z = np.full((width, height), 0)
vectors = np.stack((x, y, z), axis=2)
所以“向量”的形状是 (128, 128, 3)
我已经准备好了旋转矩阵,其中 a、b 和 c 作为沿轴的旋转角度。
rotation_matrix = np.array([
[np.cos(b) * np.cos(c),
- np.cos(b) * np.sin(c),
np.sin(b)],
[np.sin(a) * np.sin(b) * np.cos(c) + np.cos(a) * np.sin(c),
- np.sin(a) * np.sin(b) * np.sin(c) + np.cos(a) * np.cos(c),
- np.sin(a) * np.cos(b)],
[- np.cos(a) * np.sin(b) * np.cos(c) + np.sin(a) * np.sin(c),
np.cos(a) * np.sin(b) * np.sin(c) + np.sin(a) * np.cos(c),
np.cos(a) * np.cos(b)]
])
现在我希望数组的每个向量都与“rotation_matrix”相乘
vector_rotated = rotation_matrix @ vector
所以生成的数组也应该具有 (128, 128, 3) 的形状。我在处理这个 3 维数组时遇到了一些问题。 Matmul 只能处理二维数组。在 NumPy 中有什么优雅的方法可以解决这个用例,还是我必须使用 for 循环来解决这个问题?
非常感谢,祝您有美好的一天!
【问题讨论】:
-
matmul处理 3d 和更大的尺寸,但dot产品在最后 2 个维度上,而第一个是“批次”。np.einsum是另一个做高维产品的工具。 -
A (128,128,3) 与 (3,3) 一起使用。在
A@B中,A的最后一个维度与B的倒数第二个维度配对,标准矩阵乘积(跨列向下行)。 -
@hpaulj 需要明确的是,
A@B,其中A是向量,B是旋转矩阵将“起作用”,因为尺寸是一致的。但这与旋转不同,其中A将被B左乘。只要确保我们都在同一页面上:) -
@bnaecker,
vectors@rotation_matrix.T与您的轮换匹配。 -
@hpaulj 是的,当然!我只是将您的评论映射到问题中的数组。
标签: python arrays numpy matrix-multiplication shapes