W numpy mam dwie „tablice”, X
jest (m,n)
i y
jest wektorem(n,1)
za pomocą
X*y
Otrzymuję błąd
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
Kiedy (97,2)x(2,1)
jest wyraźnie legalną operacją macierzową i powinno dać mi (97,1)
wektor
EDYTOWAĆ:
Poprawiłem to, używając, X.dot(y)
ale pierwotne pytanie nadal pozostaje.
X*y
nie powinno działać (i nie działa), alenp.dot(X,y)
iX.dot(y))
powinno działać (i dla mnie tak).*
nie jest mnożeniem macierzy dlandarray
obiektów.Odpowiedzi:
dot
jest mnożeniem macierzy, ale*
robi coś innego.Mamy dwie tablice:
X
kształt (97,2)y
kształt (2,1)W przypadku tablic Numpy operacja
jest wykonywana pod względem elementów, ale jedną lub obie wartości można rozwinąć w jednym lub wielu wymiarach, aby były zgodne. Ta operacja nazywa się rozgłaszaniem. Wymiary, w których rozmiar wynosi 1 lub których brakuje, można wykorzystać w nadawaniu.
W powyższym przykładzie wymiary są niekompatybilne, ponieważ:
Tutaj są sprzeczne liczby w pierwszym wymiarze (97 i 2). Właśnie na to narzeka ValueError powyżej. Drugi wymiar byłby w porządku, ponieważ numer 1 z niczym nie koliduje.
Więcej informacji na temat zasad nadawania: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(Zwróć uwagę, że jeśli
X
iy
są typunumpy.matrix
, to gwiazdka może być używana jako mnożenie macierzy. Zalecam trzymanie się z daleka odnumpy.matrix
, to zwykle komplikuje więcej niż upraszcza).Twoje tablice powinny być w porządku
numpy.dot
; jeśli pojawi się błądnumpy.dot
, musisz mieć jakiś inny błąd. Jeśli kształty są nieprawidłowenumpy.dot
, pojawi się inny wyjątek:Jeśli nadal otrzymujesz ten błąd, prześlij minimalny przykład problemu. Przykładowe mnożenie z tablicami w kształcie twojego się udaje:
źródło
Za numpy dokumentów :
Innymi słowy, jeśli próbujesz pomnożyć dwie macierze (w sensie algebry liniowej), to chcesz,
X.dot(y)
ale jeśli próbujesz transmitować skalary z macierzyy
naX
to, musisz wykonaćX * y.T
.Przykład:
źródło
Możliwe, że błąd nie wystąpił w iloczynu skalarnym, ale po. Na przykład spróbuj tego
np.dot (a, b) będzie dobrze; jednak np.dot (a, b) * c jest ewidentnie błędne (12x1 X 1x5 = 12x5, który nie może pomnożyć 5x12) ale numpy da ci
Błąd jest mylący; jednak istnieje problem w tej linii.
źródło
Użyj
np.mat(x) * np.mat(y)
, to zadziała.źródło
Szukasz
np.matmul(X, y)
. W Pythonie 3.5+ możesz używaćX @ y
.źródło
Możemy się pomylić, że a * b to iloczyn skalarny.
Ale w rzeczywistości jest nadawany.
Iloczyn kropkowy : a.dot (b)
Nadawanie:
(m, n) + - / * (1, n) → (m, n): operacja zostanie zastosowana do m wierszy
źródło