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)
X*y
не должно работать (и это не так), ноnp.dot(X,y)
иX.dot(y))
должно работать (и для меня они работают).