Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy将矩阵与点数组相乘?_Python_Numpy - Fatal编程技术网

Python 使用numpy将矩阵与点数组相乘?

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版本会有所帮助——在看到索引后,您通常会发现有一个更简单的版本。例如,从 >>>

我有一个数组,其中包含一组点(特别是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 = 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