如何用NumPy高效利用旋转矩阵计算圆周新坐标(规避循环)
用纯矩阵运算实现单点绕X轴多角度旋转的坐标计算
优化后的代码
import numpy as np # 总旋转角度 th = np.pi # 初始点坐标 ori = np.array([1, 1, 0]) # 步数 step = 10 # 生成所有旋转角度 angles = np.linspace(0, th, step) # 计算所有角度的cos和sin值,利用numpy向量化运算 cos_angles = np.cos(angles) sin_angles = np.sin(angles) # 构建三维旋转矩阵数组,形状为(step, 3, 3) # 注:原代码中的旋转矩阵实际是绕Z轴的,若需绕X轴,可替换下方矩阵构造逻辑 rot_matrices = np.zeros((step, 3, 3)) rot_matrices[:, 0, 0] = cos_angles rot_matrices[:, 0, 1] = -sin_angles rot_matrices[:, 1, 0] = sin_angles rot_matrices[:, 1, 1] = cos_angles rot_matrices[:, 2, 2] = 1 # 一次性完成所有旋转计算,利用numpy广播机制 coords = ori @ rot_matrices print(coords)
关键思路说明
- 向量化计算三角函数:直接对整个
angles数组批量计算cos和sin,避免循环中逐个计算,充分利用numpy的底层优化。 - 三维旋转矩阵数组:构造形状为
(step, 3, 3)的数组,每个切片rot_matrices[i]对应第i个角度的旋转矩阵,实现所有旋转矩阵的一次性构建。 - 广播式矩阵乘法:将初始点
ori(形状(3,))与三维旋转矩阵数组相乘,numpy会自动广播维度,一次性得到所有旋转后的坐标(形状(step, 3)),完全规避循环。
补充:绕X轴的正确旋转矩阵
若你确实需要绕X轴旋转,替换旋转矩阵的构造逻辑为:
rot_matrices = np.zeros((step, 3, 3)) rot_matrices[:, 0, 0] = 1 rot_matrices[:, 1, 1] = cos_angles rot_matrices[:, 1, 2] = -sin_angles rot_matrices[:, 2, 1] = sin_angles rot_matrices[:, 2, 2] = cos_angles
原代码的小问题修正
原代码中初始coords已包含初始点,而循环又处理了angle=0(对应单位矩阵,结果还是初始点),导致最终结果中初始点重复出现。优化后的代码直接基于angles生成所有结果,无重复问题。
内容的提问来源于stack exchange,提问作者Certes
相关产品推荐
相关产品推荐

