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)




numpy