python numpy ValueError: операнди не вдалося транслювати разом із фігурами


129

У numpy, у мене є два "масиви", X є (m,n)і yє вектором(n,1)

використовуючи

X*y

Я отримую помилку

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

Коли (97,2)x(2,1) явно є правовою матрицею операція і повинна дати мені (97,1)вектор

Редагувати:

Я виправив це за допомогою, X.dot(y)але оригінальне питання все ще залишається.


2
Що таке "оригінальне запитання"? X*yне повинні працювати (і це не робить), але np.dot(X,y)і X.dot(y))повинні працювати (і для мене вони роблять).
DSM

3
*не є матричним множенням для ndarrayоб'єктів.
user2357112 підтримує Моніку

Я потрапив у ту ж проблему, коли вирішував wT * X, коли це повинно бути np.dot (wT, X)
Хуан Замора

X * y робить елемент мудрого множення
Віктор Зуанацці

Відповіді:


93

dotє матричним множенням, але *робить щось інше.

У нас є два масиви:

  • X, форма (97,2)
  • y, форма (2,1)

З Numpy масивами - операція

X * y

робиться елементарно, але одне або обидва значення можуть бути розширені в одному або декількох вимірах, щоб зробити їх сумісними. Ця операція називається мовленням. Розміри, де розмір становить 1 або відсутні, можуть використовуватися для мовлення.

У наведеному вище прикладі розміри несумісні, оскільки:

97   2
 2   1

Тут є суперечливі числа в першому вимірі (97 і 2). Саме на це скаржиться ValueError, наведений вище. Другий вимір був би нормальним, оскільки число 1 ні з чим не суперечить.

Для отримання додаткової інформації про правила мовлення: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Зверніть увагу, що якщо Xі yє тип numpy.matrix, то зірочка може використовуватися як множення матриць. Моя рекомендація - не слідкувати відnumpy.matrix , воно, як правило, ускладнює більше, ніж спрощує речі.)

Ваші масиви повинні бути добре з numpy.dot; якщо ви отримаєте помилку numpy.dot, ви повинні мати якусь іншу помилку. Якщо фігури неправильні numpy.dot, ви отримуєте інший виняток:

ValueError: matrices are not aligned

Якщо ви все-таки отримаєте цю помилку, будь ласка, опублікуйте мінімальний приклад проблеми. Приклад множення на масиви, схожі на ваші:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)

34

На кількість документів :

Під час роботи над двома масивами, NumPy порівнює їх фігури стихійно. Він починається з останніх розмірів і просувається вперед. Два розміри сумісні, коли:

  • вони рівні, або
  • одна з них - 1

Іншими словами, якщо ви намагаєтесь помножити дві матриці (у сенсі лінійної алгебри), то ви хочете, X.dot(y)але якщо ви намагаєтесь транслювати скаляри з матриці yна, Xто вам потрібно виконати X * y.T.

Приклад:

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

11

Можливо, помилка сталася не в точковому продукті, а після. Наприклад, спробуйте це

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) буде добре; однак np.dot (a, b) * c явно неправильний (12x1 X 1x5 = 12x5, який не може помножити на елемент 5x12), але numpy дасть вам

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

Помилка вводить в оману; однак у цій лінії є проблема.


1
Повідомлення про помилку дійсно вводить в оману, оскільки це, здається, з’являється, коли розміри матриці неправильні для елементарного множення.
Aung Htet


7

Ви шукаєте np.matmul(X, y). У Python 3.5+ ви можете використовувати X @ y.


0

Ми можемо заплутати себе у тому, що * b - це крапковий добуток.

Але насправді вона транслюється.

Точковий продукт: a.dot (b)

Трансляція:

Термін мовлення означає, як numpy обробляє масиви з різними розмірами під час арифметичних операцій, що призводять до певних обмежень, менший масив транслюється по більшому масиву, щоб вони мали сумісні форми.

(m, n) + - / * (1, n) → (m, n): операція буде застосована до m рядків

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.