Python 以行方式使用numpy matmul并进行广播

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

我有一个3D点阵列(n,3),这些点将使用3X3旋转矩阵绕原点旋转,该矩阵以nx3x3阵列的形式存储

目前,我只是在使用
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