2013-08-15 11 views
5

Nella moltiplicazione di matrice, si supponga che lo A sia una matrice 3 x 2 (3 righe, 2 colonne) e B sia una matrice 2 x 4 (2 righe, 4 colonne), quindi se una matrice C = A * B, quindi C dovrebbe avere 3 righe e 4 colonne. Perché Numpy non fa questa moltiplicazione? Quando provo il seguente codice ottengo un errore: ValueError: operands could not be broadcast together with shapes (3,2) (2,4)forme di moltiplicazione di matrice numpy

a = np.ones((3,2)) 
b = np.ones((2,4)) 
print a*b 

provo con il recepimento A e B e alwasy ottenere la stessa risposta. Perché? Come faccio a fare la moltiplicazione della matrice in questo caso?

risposta

15

L'operatore * per gli array di numpy è la moltiplicazione degli elementi (simile al prodotto Hadamard per gli array della stessa dimensione), non la moltiplicazione della matrice.

Ad esempio:

>>> a 
array([[0], 
     [1], 
     [2]]) 
>>> b 
array([0, 1, 2]) 
>>> a*b 
array([[0, 0, 0], 
     [0, 1, 2], 
     [0, 2, 4]]) 

Per matrice di moltiplicare con le matrici NumPy:

>>> a = np.ones((3,2)) 
>>> b = np.ones((2,4)) 
>>> np.dot(a,b) 
array([[ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.]]) 

Inoltre è possibile utilizzare la classe Matrix:

>>> a=np.matrix(np.ones((3,2))) 
>>> b=np.matrix(np.ones((2,4))) 
>>> a*b 
matrix([[ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.], 
     [ 2., 2., 2., 2.]]) 

Maggiori informazioni sugli array numpy radiodiffusione può essere trovato here, e ulteriori informazioni sulla classe matrix possono essere trovate here.

+0

Si deve fare attenzione all'estensione numpy sparse.linalg che definisce la classe "LinearOperator". In questa classe, l'operatore "*" viene interpretato come il solito prodotto a matrice di punti. – Guillaume

+0

quando si dovrebbe usare in matrici numpy contro matrici? Fino a poco tempo fa non ero nemmeno a conoscenza del fatto che esistesse una API matrix. –

+0

@CharlieParker Non suggerirei di usare le matrici, credo che siano destinate ad essere deprecate. – Daniel

Problemi correlati