假设我有一个由n个点云组成的数组(每个点包含m个点,维数为d(,然后是一个由表示线性变换的n个矩阵组成的列表(每个矩阵都是dxd(。有没有一种矢量化的方法可以将每个矩阵与其对应的点云相乘?(即,将第一矩阵与第一点云中的每个点相乘,将第二矩阵与第二点云中的各个点相乘,等等(
例如,这里有一个我希望能够使用For循环进行的示例计算:
import numpy as np
points = np.random.rand(3,5,2)
mats = np.array([np.eye(2), -np.eye(2), 2*np.eye(2)])
out = np.zeros((3,5,2))
for i in range(points.shape[0]):
out[i,:] = np.matmul(points[i,:], mats[i])
在这种情况下,第一个云中的每个点都应该保持不变,第二个云中的每个点的符号都应该翻转,第三个云中的每一个点的每个分量都应该加倍。
我很感激你能提供的任何帮助——我已经尝试了一段时间,但没有成功!
我认为您不需要循环:
out = np.matmul(points, mats)
或者对于Python 3.5+:
out = points @ mats
您可以使用np.einsum
:实现这一点
out = np.einsum('cmd,cdd->cmd', points, mats)
其中c
将对应于云,m
对应于点并且d
对应于特征。