2017-07-19 1 views
1

Sagen, ich habe:ersetzen Looping-over-Achsen mit Rundfunk

a = np.array([[2, 4], 
       [6, 8]])  
b = np.array([[1, 3], 
       [1, 5]]) 

ich zu bekommen:

c = np.array([[20,32], 
       [28, 44]]) 

wo c das Ergebnis ist jede Spalte von a durch b der Multiplikation, dann Summierung dieses Ergebnisses entlang der ersten Achse.

d.h .:

print(np.sum(a[:, 0] * b, axis=1)) 
[20 32] 

print(np.sum(a[:, 1] * b, axis=1)) 
[28 44] 

Kann ich durch Rundfunk zu tun, statt:

  • mit np.apply_along_axis oder
  • durch jede Spalte Looping?

Antwort

4

können Sie verwenden np.dot -

b.dot(a).T 

Alternativ np.einsum mit (für die Schüsse vielleicht) -

np.einsum('ij,ki->jk',a,b) 
+1

1+ für den Kick. –

+0

Und 'einsum' wird langsamer für kleinere Arrays und schneller für größere? –

+0

@BradSolomon Ohne Achsenausrichtungsanforderung würde ich denken, dass, wenn Sie die Anzahl der Summenreduzierungen erhöhen, d. H. Mit großen Arrays arbeiten, "np.dot" besser wäre. – Divakar