2013-08-15 19 views
5

Przy mnożeniu macierzy należy przyjąć, że A jest macierzą 3 x 2 (3 wiersze, 2 kolumny) i B jest macierzą 2 x 4 (2 wiersze, 4 kolumny), a następnie macierzą C = A * B, następnie C powinien mieć 3 wiersze i 4 kolumny. Dlaczego numpy nie robi tego mnożenia? Kiedy próbuję następujący kod pojawia się błąd: ValueError: operands could not be broadcast together with shapes (3,2) (2,4)mnożenie macierzy kształtów mnożenia

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

próbuję z transpozycją A i B i zawsze pełen uzyskać tę samą odpowiedź. Czemu? Jak w tym przypadku wykonać mnożenie macierzy?

Odpowiedz

15

Operator dla numpy tablic jest rozmnażaniem elementarnym (podobnie jak produkt Hadamard dla macierzy tego samego wymiaru), a nie macierzową.

Na przykład:

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

Dla macierzy pomnożyć NumPy tablic:

>>> 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.]]) 

Dodatkowo można użyć klasy 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.]]) 

Więcej informacji na temat nadawców tablic numpy można znaleźć here, a więcej informacji na temat klasy macierzy można znaleźć here.

+0

Należy uważać na rozszerzenie numarne sparse.linalg, które definiuje klasę "LinearOperator". W tej klasie operator "*" jest interpretowany jako zwykły produkt z macierzą punktową. – Guillaume

+0

Kiedy powinieneś używać w numpy matrycach w porównaniu do tablic? Do niedawna nie wiedziałem nawet, że istnieje matrycowy API. –

+0

@CharlieParker Nie polecam używania macierzy, uważam, że są one planowane na przestarzałe. – Daniel