使用numpy在点数组上对矩阵进行乘法运算?

10
我有一个包含一堆点的数组(具体来说是3D向量):
pts = np.array([
    [1, 1, 1],
    [2, 2, 2],
    [3, 3, 3],
    [4, 4, 4],
    [5, 5, 5],
])

我想要将这些点中的每一个都乘以一个变换矩阵:

pts[0] = np.dot(transform_matrix, pts[0])
pts[1] = np.dot(transform_matrix, pts[1])
…
pts[n] = np.dot(transform_matrix, pts[n])

我该如何高效地完成这个任务?

2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
15

我发现先写einsum版本有助于理解--当你看到指标后,通常可以认识到更简单的版本。例如,从以下开始:

>>> pts = np.random.random((5,3))
>>> transform_matrix = np.random.random((3,3))
>>> 
>>> pts_brute = pts.copy()
>>> for i in range(len(pts_brute)):
...         pts_brute[i] = transform_matrix.dot(pts_brute[i])
...     
>>> pts_einsum = np.einsum("ij,kj->ik", pts, transform_matrix)
>>> np.allclose(pts_brute, pts_einsum)
True

您可以看到这很简单

>>> pts_dot = pts.dot(transform_matrix.T)
>>> np.allclose(pts_brute, pts_dot)
True

太棒了,谢谢!另外,einsum的技巧很好,谢谢。 - David Wolever

5

矩阵乘法可以看作是“批量模式”下的矩阵向量乘法,其中第二个矩阵中的每一列都是由第一个矩阵相乘得到的向量之一,结果向量则为所得矩阵的列。

同时请注意,由于(AB)T=BTAT,因此(通过转置两边)((AB)T)T=AB=(BTAT)T,你可以使用类似的方式来描述第一个矩阵的行与第二个矩阵的转置进行批量(左)乘法,结果向量将成为矩阵乘积的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,