Python 以行方式使用numpy matmul并进行广播
我有一个3D点阵列(n,3),这些点将使用3X3旋转矩阵绕原点旋转,该矩阵以nx3x3阵列的形式存储 目前,我只是在使用Python 以行方式使用numpy matmul并进行广播,python,numpy,matrix-multiplication,array-broadcasting,numpy-einsum,Python,Numpy,Matrix Multiplication,Array Broadcasting,Numpy Einsum,我有一个3D点阵列(n,3),这些点将使用3X3旋转矩阵绕原点旋转,该矩阵以nx3x3阵列的形式存储 目前,我只是在使用matmul的for循环中执行此操作,但我认为这是毫无意义的,因为必须有一种更快的广播方式来执行此操作 现行代码 注意:在这个例子中,我刚刚平铺了相同的旋转矩阵,但在我的实际情况中,每个3x3旋转矩阵是不同的 我想做什么 我猜一定有某种方法可以传播,因为当点云变得非常大时,for循环变得非常慢。我想这样做: np.matmul(rotation_matrices, points
matmul
的for循环中执行此操作,但我认为这是毫无意义的,因为必须有一种更快的广播方式来执行此操作
现行代码
注意:在这个例子中,我刚刚平铺了相同的旋转矩阵,但在我的实际情况中,每个3x3旋转矩阵是不同的
我想做什么
我猜一定有某种方法可以传播,因为当点云变得非常大时,for
循环变得非常慢。我想这样做:
np.matmul(rotation_matrices, points)
其中,点
中的每个行
乘以其相应的旋转矩阵。可能有一种方法可以用np.einsum
实现这一点,但我无法找出签名。如果你看到,np.einsum('ij,jk',a,b)
是matmul
的签名
因此,您可以使用签名尝试np.einsum
:
np.einsum('kij,kj->ki', rotation_matrices, points)
测试:
einsum = np.einsum('kij,kj->ki', rotation_matrices, points)
manual = np.array([np.matmul(x,y) for x,y in zip (rotation_matrices, points)])
np.allclose(einsum, manual)
# True
我试过了,但它没有给出相同的结果
np.allclose(result,np.einsum('kij,kj->ki',旋转矩阵,点))
=False@jpmorr在我这方面是正确的。确保在两次运行中不会重新生成rotation\u矩阵
和点
。np.matmul(rotation\u矩阵,点[…,无])
也起作用。正在重新创建它,似乎……谢谢。
einsum = np.einsum('kij,kj->ki', rotation_matrices, points)
manual = np.array([np.matmul(x,y) for x,y in zip (rotation_matrices, points)])
np.allclose(einsum, manual)
# True