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 или которые отсутствуют.
В приведенном выше примере размеры несовместимы, потому что:
972 21
Здесь в первом измерении есть конфликтующие числа (97 и 2). Именно на это жалуется ValueError выше. Второе измерение было бы в порядке, поскольку число 1 ни с чем не конфликтует.
(Пожалуйста, обратите внимание, что если 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)
При работе с двумя массивами 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)
Ошибка вводит в заблуждение; однако в этой строке есть проблема.