2

如果我有一個矩陣A,我希望得到的點積與B.如何爲另一個矩陣的每一行矢量化一個矩陣的點積?

import numpy as np 

a = np.array([[1.0, 2.0], 
       [3.0, 4.0]]) 

b = np.array([[1.0, 1.0], 
       [2.0, 2.0], 
       [3.0, 3.0]]) 

的每一行,如果目標是做手工(或循環):

c = np.array([np.dot(a, b[0])]) 
c = np.append(c, [np.dot(a, b[1])], axis=0) 
c = np.append(c, [np.dot(a, b[2])], axis=0) 

print(c) 

c = [[ 3. 7.] 
    [ 6. 14.] 
    [ 9. 21.]] 
+0

什麼是第二列? –

+0

我不是在追問,第二欄是什麼? – dranobob

回答

2

對於某些移調和矩陣乘法使用np.dot -

a.dot(b.T).T 
b.dot(a.T) 

隨着np.einsum -

np.einsum('ij,kj->ki',a,b) 

隨着np.tensordot -

np.tensordot(b,a,axes=((1,1))) 

運行測試 -

In [123]: a = np.random.rand(2000, 2000) 
    ...: b = np.random.rand(3000, 2000) 
    ...: 

In [124]: %timeit a.dot(b.T).T 
    ...: %timeit b.dot(a.T) 
    ...: %timeit np.einsum('ij,kj->ki',a,b) 
    ...: %timeit np.tensordot(b,a,axes=((1,1))) 
    ...: 
1 loops, best of 3: 234 ms per loop 
10 loops, best of 3: 169 ms per loop 
1 loops, best of 3: 7.59 s per loop 
10 loops, best of 3: 170 ms per loop 
+0

如此優雅和簡單。現在我要去親自去做這件事來了解它爲什麼會起作用。 – dranobob

+0

這個「einsum」是怎麼回事? –

+0

@PaulPanzer只要點產品善於減少總和。只有當我們需要保持一個或多個軸對齊時,'einsum'才起作用,而不是這裏的情況。 – Divakar

相關問題