如何用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
相关产品推荐
相关产品推荐

