python numpy ValueError: operandy nie mogły być transmitowane razem z kształtami

129

W numpy mam dwie „tablice”, Xjest (m,n)i yjest 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.

yayu
źródło
2
Jakie jest „pierwotne pytanie”? X*ynie powinno działać (i nie działa), ale np.dot(X,y)i X.dot(y))powinno działać (i dla mnie tak).
DSM,
3
*nie jest mnożeniem macierzy dla ndarrayobiektów.
user2357112 obsługuje Monikę
W ten sam problem wpadłem przy rozwiązywaniu wT * X, kiedy to powinno być np.dot (wT, X)
Juan Zamora
X * y mnoży element mądry
Victor Zuanazzi,

Odpowiedzi:

93

dotjest mnożeniem macierzy, ale *robi coś innego.

Mamy dwie tablice:

  • Xkształt (97,2)
  • ykształt (2,1)

W przypadku tablic Numpy operacja

X * y

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ż:

97   2
 2   1

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 Xi ysą typu numpy.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łąd numpy.dot, musisz mieć jakiś inny błąd. Jeśli kształty są nieprawidłowe numpy.dot, pojawi się inny wyjątek:

ValueError: matrices are not aligned

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:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
DrV
źródło
34

Za numpy dokumentów :

Działając na dwóch tablicach, NumPy porównuje ich kształty pod względem elementów. Rozpoczyna się od wymiarów końcowych i posuwa się naprzód. Dwa wymiary są kompatybilne, gdy:

  • są równe lub
  • jeden z nich to 1

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 macierzy yna Xto, musisz wykonać X * y.T.

Przykład:

>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
>>> X * y
array([[0,1],
       [0,3],
       [0,5],
       [0,7]])
gobrewers14
źródło
11

Możliwe, że błąd nie wystąpił w iloczynu skalarnym, ale po. Na przykład spróbuj tego

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c

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

ValueError: operands could not be broadcast together with shapes (12,1) (1,5)

Błąd jest mylący; jednak istnieje problem w tej linii.

Kenan
źródło
1
Komunikat o błędzie jest rzeczywiście mylący, ponieważ wydaje się, że pojawia się, gdy wymiary macierzy są nieprawidłowe dla mnożenia według elementów.
Aung Htet
7

Użyj np.mat(x) * np.mat(y), to zadziała.

user3101695
źródło
7

Szukasz np.matmul(X, y). W Pythonie 3.5+ możesz używać X @ y.

iamanigeeit
źródło
0

Możemy się pomylić, że a * b to iloczyn skalarny.

Ale w rzeczywistości jest nadawany.

Iloczyn kropkowy : a.dot (b)

Nadawanie:

Termin rozgłaszanie odnosi się do tego, jak numpy traktuje tablice o różnych wymiarach podczas operacji arytmetycznych, które prowadzą do pewnych ograniczeń, mniejsza tablica jest rozgłaszana przez większą tablicę, tak że mają zgodne kształty.

(m, n) + - / * (1, n) → (m, n): operacja zostanie zastosowana do m wierszy

chia yongkang
źródło