2014-10-10 55 views
5

我有其中包含一串点的数组(3D矢量,特别):使用numpy在一系列点上乘以一个矩阵?

pts = np.array([ 
    [1, 1, 1], 
    [2, 2, 2], 
    [3, 3, 3], 
    [4, 4, 4], 
    [5, 5, 5], 
]) 

而且我想通过变换矩阵相乘的那些点中的每一个:

pts[0] = np.dot(transform_matrix, pts[0]) 
pts[1] = np.dot(transform_matrix, pts[1]) 
… 
pts[n] = np.dot(transform_matrix, pts[n]) 

我该如何有效地做到这一点?

回答

9

我发现首先编写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 
+0

太棒了,谢谢!另外,这是一个关于'einsum'的好消息 - 谢谢。 – 2014-10-10 01:07:56

3

基质矩阵乘法可以被认为是“批处理模式”矩阵 - 向量乘法,在第二其中每列矩阵是与第一个矩阵相乘的向量之一,其结果向量是结果矩阵的列。

还要注意,由于(AB)Ť = B ŤŤ,因此(通过转置两侧)((AB)ŤŤ = AB =(B ŤŤŤ可以做出类似的声明关于所述第一矩阵的是分批(左)乘以转所述第二矩阵的行,结果矢量是所述矩阵 产品。