В 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)
но исходный вопрос все еще остается.
X*y
не должно работать (и это не так), ноnp.dot(X,y)
иX.dot(y))
должно работать (и для меня они работают).*
не является матричным умножением дляndarray
объектов.Ответы:
dot
это матричное умножение, но*
делает кое-что еще.У нас есть два массива:
X
, форма (97,2)y
, форма (2,1)С массивами Numpy операция
выполняется поэлементно, но одно или оба значения могут быть расширены в одном или нескольких измерениях, чтобы сделать их совместимыми. Эта операция называется трансляцией. Размеры, у которых размер равен 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
, вы получите другое исключение:Если вы по-прежнему получаете эту ошибку, опубликуйте минимальный пример проблемы. Пример умножения с массивами, имеющими форму вашего, успешен:
источник
Per Numpy документы :
Другими словами, если вы пытаетесь перемножить две матрицы (в смысле линейной алгебры), тогда вы хотите,
X.dot(y)
но если вы пытаетесь транслировать скаляры из матрицыy
на,X
тогда вам нужно выполнитьX * y.T
.Пример:
источник
Возможно, ошибка возникла не в скалярном произведении, а после. Например, попробуйте это
np.dot (a, b) будет хорошо; однако np.dot (a, b) * c явно неверен (12x1 X 1x5 = 12x5, который не может поэлементно умножать 5x12), но numpy даст вам
Ошибка вводит в заблуждение; однако в этой строке есть проблема.
источник
Используйте
np.mat(x) * np.mat(y)
, это сработает.источник
Вы ищите
np.matmul(X, y)
. В Python 3.5+ вы можете использоватьX @ y
.источник
Мы можем запутаться в том, что a * b - это точечный продукт.
Но на самом деле это транслируется.
Точечный продукт: a.dot (b)
Broadcast:
(m, n) + - / * (1, n) → (m, n): операция будет применена к m строкам
источник