NumPy中是否存在向量化方法批量对向量组应用变换矩阵?
解答
不需要依赖for循环,用NumPy原生的矩阵运算配合广播机制就可以一次性完成所有点的变换,性能远高于逐行循环。
实现逻辑
你原代码中逐行做的np.dot(rotM, trajectory[i][1:]),本质是对每个三维坐标向量应用同一个3x3线性变换矩阵。这类批量同矩阵变换完全可以通过整体矩阵运算实现,没有Python层面的循环开销,数据量越大速度优势越明显。
向量化实现代码
import numpy as np angle = np.deg2rad(90) rotM = np.array( [ [np.cos(angle), -np.sin(angle), 0], [np.sin(angle), np.cos(angle), 0], [ 0, 0, 1], ] ) # 轨迹列顺序:t, x, y, z trajectory = np.array( [ [1, 1, 0, 0], [2, 2, 1, 0], [3, 3, 2, 0], [4, 4, 3, 1], [5, 6, 4, 2], [6, 9, 5, 3], ] ) # 批量完成所有点的坐标变换 trajectory[:, 1:] = trajectory[:, 1:] @ rotM.T
细节说明
trajectory[:, 1:]会一次性取出所有轨迹点的x/y/z坐标,数组形状为(点数量, 3)- 单个列向量形式的坐标
v变换公式为rotM @ v;当所有坐标以行向量形式堆叠为(点数量,3)的矩阵时,行向量的等价变换为右乘旋转矩阵的转置rotM.T,计算结果和原for循环输出完全一致 - 如果偏好列向量的计算逻辑,也可以将变换部分写为
trajectory[:, 1:] = (rotM @ trajectory[:, 1:].T).T,两种写法结果无差异 - 你之前查到的
numpy.linalg.multi_dot用于优化多个矩阵连续相乘时的计算顺序、降低运算量,并不适配单矩阵批量变换多向量的场景。
内容的提问来源于stack exchange,提问作者mapf
相关产品推荐
相关产品推荐

