You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:57:21