dot
è la moltiplicazione di matrici, ma *
fa qualcos'altro.
Abbiamo due array:
X
, forma (97,2)
y
, forma (2,1)
Con gli array Numpy, l'operazione
X * y
è fatto per elemento, ma uno o entrambi i valori possono essere espansi in una o più dimensioni per renderli compatibili. Questa operazione è chiamata trasmissione. Le dimensioni in cui la dimensione è 1 o mancanti possono essere utilizzate nella trasmissione.
Nell'esempio sopra le dimensioni sono incompatibili, perché:
97 2
2 1
Qui ci sono numeri in conflitto nella prima dimensione (97 e 2). Questo è ciò di cui si lamenta ValueError sopra. La seconda dimensione andrebbe bene, poiché il numero 1 non è in conflitto con nulla.
Per ulteriori informazioni sulle regole di trasmissione: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(Si noti che se X
e y
sono di tipo numpy.matrix
, allora l'asterisco può essere utilizzato come moltiplicazione di matrici. Il mio consiglio è di tenersi alla larga numpy.matrix
, tende a complicare più che a semplificare le cose.)
I tuoi array dovrebbero andare bene con numpy.dot
; se ricevi un errore numpy.dot
, devi avere qualche altro bug. Se le forme sono sbagliate numpy.dot
, ottieni un'eccezione diversa:
ValueError: matrices are not aligned
Se continui a ricevere questo errore, pubblica un esempio minimo del problema. Un esempio di moltiplicazione con array a forma di tuo riesce:
In [1]: import numpy
In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
X*y
Non dovrebbe funzionare (e non lo fa), manp.dot(X,y)
eX.dot(y))
dovrebbe funzionare (e per me lo fanno).