2014-10-10 109 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 ŤŤŤ可以做出類似的聲明關於所述第一矩陣的是分批(左)乘以轉所述第二矩陣的行,結果矢量是所述矩陣 產品。