In [446]: x = np.zeros(6)
...: y = np.zeros([7, 6])
...: z = y * x
In [447]: z.shape
Out[447]: (7, 6)
Здесь мы делаем поэлементное умножение, (7,6) с (6,). Передавая (6,) становится (1,6), а затем (7,6), чтобы соответствовать y
.
Очевидно, в случае foo.bar
, y
- это np.matrix
подкласс:
In [454]: y1 = np.matrix(y)
In [455]: y1*x
---...
219 # This promotes 1-D vectors to row vectors
--> 220 return N.dot(self, asmatrix(other))
...
ValueError: shapes (7,6) and (1,6) not aligned: 6 (dim 1) != 1 (dim 0)
Обратите внимание на другой дисплей для y1
:
In [456]: y1
Out[456]:
matrix([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
С np.matrix
*
определяется как np.dot
, матричное произведение. x
также конвертируется np.matrix
, создавая матрицу (1,6). Сообщение об ошибке следует из определения умножения матриц.
np.multiply
может использоваться для поэлементного умножения. Обратите внимание на класс результата:
In [458]: np.multiply(y1,x)
Out[458]:
matrix([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
Из-за подобных заблуждений np.matrix
не поощряется.