多维数组是坐标变换最自然的载体,需选对结构、用对操作:单点用1D数组,多点用2D数组(每行一点),齐次坐标补1;变换统一用矩阵左乘,注意维度对齐与向量化计算。

多维数组是坐标变换最自然的载体——它本身就能直接承载空间位置、变换矩阵和运算结果。关键不在“能不能做”,而在于选对结构、用对操作、避开常见陷阱。
明确坐标表示方式
坐标点必须组织成合适形状的数组,否则后续变换会出错:
- 单个点:用一维数组,如 np.array([x, y])(2D)或 np.array([x, y, z])(3D)
- 多个点:用二维数组,每行一个点,如 shape=(N, 2) 或 (N, 3)
- 齐次坐标(方便统一处理平移):末尾补1,变成 (N, 3) → (N, 4),对应仿射变换矩阵 4×4
用矩阵乘法实现标准变换
平移、旋转、缩放等基本操作,统一用矩阵左乘实现,前提是坐标已转为齐次形式:
- 平移:构造 T = [[1,0,tx],[0,1,ty],[0,0,1]],再 points_h @ T.T(注意转置或使用 np.dot)
- 旋转(2D):用 R = [[cosθ,-sinθ],[sinθ,cosθ]],直接 points @ R.T
- 组合变换:按顺序连乘,如 M = T @ R @ S,再一次性作用于所有点
注意维度对齐与广播规则
NumPy 不会自动“猜”你想怎么乘,维度不匹配会报错或产生意外结果:
- 点集 (N, 3) × 变换矩阵 (3, 3) → 结果是 (N, 3),正确
- 若误写成 (3, N) × (3, 3),会触发广播异常或得到错误形状
- 推荐显式使用 @ 运算符或 np.matmul(),避免 np.dot() 在高维时行为不一致
批量处理时优先向量化
别用 for 循环逐点变换——既慢又易错:
- 错误写法:for p in points: transformed.append(p @ R)
- 正确写法:transformed = points @ R.T(自动对每行做右乘)
- 对图像像素坐标、点云数据、关键点序列,向量化能提速数十倍


















