如何用Python数组运算实现多向量的3D坐标系转换?
批量实现局部坐标系到实验室坐标系的向量转换(Numpy向量化方案)
核心思路
- 将局部球坐标向量转为局部笛卡尔坐标
- 基于每个局部坐标系的z轴(实验室系球坐标)批量构造旋转矩阵
- 利用Numpy广播和批量矩阵乘法,一次性完成所有向量的坐标转换,彻底避免逐向量循环
实现代码
import numpy as np def sph2cart(r, theta, phi): """向量化球坐标转笛卡尔坐标,输入支持n行数组""" x = r * np.sin(theta) * np.cos(phi) y = r * np.sin(theta) * np.sin(phi) z = r * np.cos(theta) return np.stack([x, y, z], axis=-1) def build_rotation_matrices(z_sph): """批量构造旋转矩阵:输入n行局部z轴的实验室球坐标,输出(n,3,3)旋转矩阵数组""" # 转成实验室系下的笛卡尔单位向量 z_axis = sph2cart(1.0, z_sph[:, 1], z_sph[:, 2]) # shape (n, 3) # 处理z轴与实验室z轴平行的特殊情况,避免叉乘为零 mask = np.isclose(z_axis[:, 2], 1.0) | np.isclose(z_axis[:, 2], -1.0) x_candidate = np.where(mask[:, None], np.array([1.0, 0.0, 0.0]), np.array([0.0, 0.0, 1.0])) # 生成与z轴正交的x轴并归一化 x_axis = np.cross(x_candidate, z_axis) x_axis /= np.linalg.norm(x_axis, axis=1, keepdims=True) # 生成正交的y轴(z叉乘x) y_axis = np.cross(z_axis, x_axis) # 构造旋转矩阵:每一列对应局部坐标系的x/y/z轴在实验室系的分量 return np.stack([x_axis, y_axis, z_axis], axis=-1) # shape (n, 3, 3) def local_to_lab(vec_sph_local, z_sph_lab): """ 批量转换局部向量到实验室坐标系 :param vec_sph_local: (n,3)数组,每行是局部球坐标(r, theta, phi) :param z_sph_lab: (n,3)数组,每行是局部z轴的实验室球坐标(r, theta, phi) :return: (n,3)数组,每行是实验室系笛卡尔坐标分量 """ # 1. 局部球坐标转笛卡尔坐标 vec_cart_local = sph2cart(vec_sph_local[:,0], vec_sph_local[:,1], vec_sph_local[:,2]) # 2. 批量生成旋转矩阵 rotation_matrices = build_rotation_matrices(z_sph_lab) # 3. 批量完成旋转转换 return np.einsum('nij,nj->ni', rotation_matrices, vec_cart_local)
关键细节说明
- 向量化球坐标转换:直接对n行数组运算,无需遍历每个向量
- 旋转矩阵批量构造:通过Numpy广播和条件判断,一次性生成所有局部坐标系的旋转矩阵,处理了z轴平行的边界情况
- 高效批量乘法:
np.einsum实现了(n,3,3)矩阵与(n,3)向量的批量点积,等价于逐向量计算R[i] @ vec[i],但性能是循环的数十倍
测试示例
# 测试用例:2个局部向量+对应的2个局部z轴 n = 2 vec_sph_local = np.array([ [1.0, np.pi/4, np.pi/4], # 局部向量1:r=1,极角π/4,方位角π/4 [2.0, np.pi/3, np.pi/6] # 局部向量2:r=2,极角π/3,方位角π/6 ]) z_sph_lab = np.array([ [1.0, np.pi/6, np.pi/3], # 局部z轴1:实验室系极角π/6,方位角π/3 [1.0, np.pi/2, np.pi/4] # 局部z轴2:实验室系极角π/2,方位角π/4 ]) # 转换得到实验室系笛卡尔坐标 result = local_to_lab(vec_sph_local, z_sph_lab) print("实验室系笛卡尔坐标:") print(result)
内容的提问来源于stack exchange,提问作者Random_Astro_Student
相关产品推荐
相关产品推荐

