tutorial - subplot title python
Moltiplicare diverse matrici in numpy (4)
Questa potrebbe essere una funzione relativamente recente, ma mi piace:
A.dot(B).dot(C)
o se avessi una lunga catena che potresti fare:
reduce(numpy.dot, [A1, A2, ..., An])
Aggiornare:
Ci sono più informazioni su ridurre here. Ecco un esempio che potrebbe aiutare.
>>> A = [np.random.random((5, 5)) for i in xrange(4)]
>>> product1 = A[0].dot(A[1]).dot(A[2]).dot(A[3])
>>> product2 = reduce(numpy.dot, A)
>>> numpy.all(product1 == product2)
True
Aggiornamento 2016: A partire da python 3.5, c'è un nuovo simbolo matrix_multiply, @
:
R = A @ B @ C
Supponiamo di avere n matrici quadrate A1, ..., An. Esiste comunque la possibilità di moltiplicare queste matrici in modo pulito? Per quanto ne so, dot in numpy accetta solo due argomenti. Un modo ovvio è definire una funzione per chiamarsi e ottenere il risultato. C'è un modo migliore per farlo?
Resuscitare una vecchia domanda con un aggiornamento:
A partire dal 13 novembre 2014 ora np.linalg.multi_dot
una funzione np.linalg.multi_dot
che fa esattamente ciò che vuoi. Ha anche il vantaggio di ottimizzare l'ordine delle chiamate, anche se non è necessario nel tuo caso.
Si noti che questo disponibile inizia con la versione numpy 1.10.
Un altro modo per ottenere questo risultato sarebbe l'utilizzo di einsum
, che implementa la convenzione di sommatoria di Einstein per NumPy.
Per spiegare brevemente questa convenzione in merito a questo problema: quando scrivi il tuo prodotto a matrice multipla come una grande somma di prodotti, ottieni qualcosa del tipo:
P_im = sum_j sum_k sum_l A1_ij A2_jk A3_kl A4_lm
dove P
è il risultato del tuo prodotto e A1
, A2
, A3
e A4
sono le matrici di input. Si noti che si sommano esattamente quegli indici che compaiono due volte nel summiass, vale a dire j
, k
, e l
. Come una somma con questa proprietà appare spesso in fisica, calcolo vettoriale e probabilmente in altri campi, c'è uno strumento NumPy per esso, vale a dire einsum
.
Nell'esempio sopra, puoi usarlo per calcolare il tuo prodotto matrice come segue:
P = np.einsum( "ij,jk,kl,lm", A1, A2, A3, A4 )
Qui, il primo argomento dice alla funzione quali indici applicare alle matrici degli argomenti e quindi tutti gli indici che appaiono doppiamente vengono sommati, ottenendo il risultato desiderato.
Si noti che l'efficienza computazionale dipende da diversi fattori (quindi probabilmente è meglio provarlo semplicemente):
- Perché l'einsum di Numpy è più lento delle funzioni built-in di Numpy?
- Perché numpy's einsum è più veloce delle funzioni incorporate di numpy?
A_list = [np.random.randn(100, 100) for i in xrange(10)]
B = np.eye(A_list[0].shape[0])
for A in A_list:
B = np.dot(B, A)
C = reduce(np.dot, A_list)
assert(B == C)