<p><code>np.dot(a, b)</code>操作<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html" rel="nofollow">over the last axis of a and the second-to-last of b</a>。因此,对于您的问题中的特定情况,您可以始终使用:</p>
<pre><code>>>> a.dot(v)
array([[ 3., 3., 3.],
[ 3., 3., 3.],
[ 3., 3., 3.]])
</code></pre>
<p>如果要保持<code>v.dot(a)</code>顺序,则需要将轴放置到位,这可以通过<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.rollaxis.html" rel="nofollow">^{<cd3>}</a>轻松实现:</p>
^{2}$
<p>我不太喜欢<code>np.dot</code>,除非是为了明显的矩阵或向量乘法,因为在使用可选的<code>out</code>参数时,它对输出数据类型非常严格。Joe Kington已经提到过了,但是如果你要做这种事情,就要习惯<code>np.einsum</code>:一旦你掌握了语法的诀窍,它将把你花在重塑事物上的时间减少到最低限度:</p>
<pre><code>>>> a = np.ones((3, 3, 2))
>>> np.einsum('i, jki', v, a)
array([[ 3., 3., 3.],
[ 3., 3., 3.],
[ 3., 3., 3.]])
</code></pre>
<p>这并不是说它在本案中的相关性太大,但它的速度也快得惊人:</p>
<pre><code>In [4]: %timeit a.dot(v)
100000 loops, best of 3: 2.43 us per loop
In [5]: %timeit v.dot(np.rollaxis(a, 2, 1))
100000 loops, best of 3: 4.49 us per loop
In [7]: %timeit np.tensordot(v, a, axes=(0, 2))
100000 loops, best of 3: 14.9 us per loop
In [8]: %timeit np.einsum('i, jki', v, a)
100000 loops, best of 3: 2.91 us per loop
</code></pre>