Python 使用numpy将矩阵与点数组相乘?
我有一个数组,其中包含一组点(特别是3D向量): 我想用一个变换矩阵乘以这些点中的每一个:Python 使用numpy将矩阵与点数组相乘?,python,numpy,Python,Numpy,我有一个数组,其中包含一组点(特别是3D向量): 我想用一个变换矩阵乘以这些点中的每一个: pts[0] = np.dot(transform_matrix, pts[0]) pts[1] = np.dot(transform_matrix, pts[1]) … pts[n] = np.dot(transform_matrix, pts[n]) 如何才能有效地做到这一点?我发现先编写einsum版本会有所帮助——在看到索引后,您通常会发现有一个更简单的版本。例如,从 >>>
pts[0] = np.dot(transform_matrix, pts[0])
pts[1] = np.dot(transform_matrix, pts[1])
…
pts[n] = np.dot(transform_matrix, pts[n])
如何才能有效地做到这一点?我发现先编写
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
矩阵乘法可以被认为是“批处理模式”矩阵向量乘法,其中第二个矩阵中的每一列是与第一个矩阵相乘的向量之一,结果向量是结果矩阵的列
还要注意的是,由于(AB)T=BTAT,因此(通过两边转置)((AB)T)T=AB=(BTAT)T,您可以对第一个矩阵的行与第二个矩阵的转置(左)成批相乘做出类似的陈述,结果向量是矩阵积的行。太棒了,谢谢!另外,这是一个关于
einsum
的好提示-谢谢。
>>> pts_dot = pts.dot(transform_matrix.T)
>>> np.allclose(pts_brute, pts_dot)
True