<pre><code>In [446]: x = np.zeros(6)
...: y = np.zeros([7, 6])
...: z = y * x
In [447]: z.shape
Out[447]: (7, 6)
</code></pre>
<p>这里我们做的是元素乘法,a(7,6)和a(6,)。通过广播,(6,)变成(1,6),然后(7,6)来匹配<code>y</code>。你知道吗</p>
<p>显然,在<code>foo.bar</code>情况下,<code>y</code>是<code>np.matrix</code>子类:</p>
<pre><code>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)
</code></pre>
<p>注意<code>y1</code>的不同显示:</p>
<pre><code>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.]])
</code></pre>
<p>用<code>np.matrix</code><code>*</code>定义为<code>np.dot</code>,矩阵积。<code>x</code>也被转换成<code>np.matrix</code>,产生(1,6)矩阵。错误信息来自矩阵乘法的定义。你知道吗</p>
<p><code>np.multiply</code>可以用来强制按元素进行乘法。请注意结果的类别:</p>
<pre><code>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.]])
</code></pre>
<p>因为这样的混乱<code>np.matrix</code>正在被劝阻。你知道吗</p>