Вопрос-Ответ

python numpy ValueError: operands could not be broadcast together with shapes

python numpy ValueError: не удалось передать операнды вместе с фигурами

В 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) но первоначальный вопрос все еще остается.

Переведено автоматически
Ответ 1

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, то asterisk можно использовать для умножения матрицы. Моя рекомендация - держаться подальше от 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)
Ответ 2

Согласно документам numpy:


При работе с двумя массивами 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]])
Ответ 3

Вы ищете np.matmul(X, y). В Python 3.5+ вы можете использовать X @ y.

Ответ 4

Возможно, ошибка произошла не при точечном произведении, а после. Например, попробуйте это

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)

Ошибка вводит в заблуждение; однако в этой строке есть проблема.

python numpy