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

如何用Numpy实现3D变换矩阵对2D点列表的左乘变换?

问题描述

我有一个用于2D点的3×3变换矩阵,示例如下:

array([[2., 0., 0.],
       [0., 2., 0.],
       [0., 0., 1.]])

补充说明:这只是示例,实际变换可能包含平移,因此矩阵必须是该尺寸。

我还有一个形状为(<point数量>, 2)的2D点列表,希望用该变换矩阵对其进行左乘变换(即my_matrix @ my_point)。我认为在Numpy中实现需要两步:

  • 转置2D点列表
  • 为每个2D点添加z值为1,使其成为3维点

请问如何用Numpy简便实现?最终结果需回到输入格式的2D点列表,伪代码示例如下:

(matrix @ points.T.add_z_dimension()).T[:-1]
解决方案

分步实现

可以通过Numpy的数组拼接工具快速构造齐次坐标,再完成矩阵变换,最后还原成2D点格式:

import numpy as np

# 定义变换矩阵和2D点数组
my_matrix = np.array([[2., 0., 0.],
                      [0., 2., 0.],
                      [0., 0., 1.]])
points = np.array([[1, 2], [3, 4], [5, 6]])

# 1. 给每个2D点添加z=1,转为齐次坐标(形状变为(N,3))
points_homogeneous = np.hstack([points, np.ones((points.shape[0], 1))])

# 2. 执行左乘变换,再转置并提取前两维,得到变换后的2D点
transformed_points = (my_matrix @ points_homogeneous.T).T[:, :2]

一行简化写法

如果需要更紧凑的代码,可以把步骤合并:

transformed_points = (my_matrix @ np.hstack([points, np.ones((points.shape[0], 1))]).T).T[:, :2]

关键步骤解释

  • np.hstack([points, np.ones((points.shape[0],1))]):将原2D点数组与全1的列数组横向拼接,生成齐次坐标格式的点数组(每个点增加z=1维度)
  • my_matrix @ points_homogeneous.T:利用矩阵左乘完成变换,此时结果形状为(3, N)
  • .T[:, :2]:将结果转置回(N, 3)格式后,截取前两列,还原为输入时的(N,2)形状的2D点列表

内容的提问来源于stack exchange,提问作者Leon0402

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:01:18