2012-06-24 16 views
14

Ho difficoltà a comprendere le regole per la trasmissione di array in Numpy.Regole di trasmissione di Numpy array

Ovviamente, se si esegue la moltiplicazione a livello di elemento su due array di stesse dimensioni e forma, tutto è a posto. Inoltre, se si moltiplica una matrice multidimensionale con uno scalare, funziona. Questo capisco.

Ma se si dispone di due array N-dimensionale di diverse forme, non è chiaro per me esattamente quali siano le regole di trasmissione. Questo documentation/tutorial spiega che: Per la trasmissione, la dimensione degli assi finali per entrambi gli array in un'operazione deve essere della stessa dimensione o uno deve essere uno.

Ok, quindi immagino da trascinamento asse essi si riferiscono alla N in una matrice M x N. Quindi, questo significa che se provo a moltiplicare due array 2D (matrici) con lo stesso numero di colonne, dovrebbe funzionare? Tranne che non è così ...

>>> from numpy import * 
>>> A = array([[1,2],[3,4]]) 
>>> B = array([[2,3],[4,6],[6,9],[8,12]]) 
>>> print(A) 
[[1 2] 
[3 4]] 
>>> print(B) 
[[ 2 3] 
[ 4 6] 
[ 6 9] 
[ 8 12]] 
>>> 
>>> A * B 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

Dato che sia A e B hanno due colonne, avrei pensato che avrebbe funzionato. Quindi, probabilmente sto fraintendendo qualcosa sul termine "asse finale" e su come si applica agli array N-dimensionali.

Qualcuno può spiegare perché il mio esempio non funziona e cosa si intende per "asse finale"?

+1

Questa è una spiegazione molto buona della trasmissione, http://www.scipy.org/EricsBroadcastingDoc –

+0

potresti aggiungere il tag "broadcasting" per favore? – denis

+0

Il collegamento nel commento @BiRico è ora http://wiki.scipy.org/EricsBroadcastingDoc Mi chiedo perché sia ​​stato spostato nel * dump di archivio *. – iled

risposta

10

Bene, il significato degli assi finali viene spiegato nella pagina della documentazione collegata. Se si dispone di due array con un numero di dimensioni diverso, ad esempio uno 1x2x3 e altri 2x3, si confrontano solo le dimensioni comuni finali, in questo caso 2x3. Ma se entrambi i tuoi array sono bidimensionali, le loro dimensioni corrispondenti devono essere uguali o una di esse deve essere 1. Le dimensioni lungo le quali la matrice ha la dimensione 1 sono chiamate singolari e la matrice può essere trasmessa lungo di esse.

Nel tuo caso hai una 2x2 e 4x2 e 4 != 2 e né 4 o 2 uguale 1, quindi questo non funziona.

+0

In altre parole, la 'forma' di' A' dovrebbe essere un suffisso della 'forma' di' B ', ignorando qualsiasi asse che valore 1 (?) –

+1

se ignorando si intende '' 1' uguale a qualsiasi' e sia 'shape (A)' o 'shape (B)' possono essere suffissi l'uno dell'altro, quindi sì. – unkulunkulu

+1

, in realtà, puoi osservare qualsiasi array come dimensione infinita delle dimensioni '... x1x1x1x1x1x1x1x ..... xAxBxC', quindi abbiamo molti' '1' che possono essere trasmessi come altri. In questo modo puoi dimenticare quel suffisso, solo dire "1" uguale a qualsiasi cosa. – unkulunkulu