擅长:python、mysql、java
<p>在这种特殊情况下,也可以使用<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html" rel="nofollow">^{<cd1>}</a>。在</p>
<pre><code>import numpy as np
A = np.ones((3,3,2))
v = np.array([1,2])
print np.tensordot(v, A, axes=(0, 2))
</code></pre>
<p>这就产生了:</p>
^{2}$
<p><code>axes=(0,2)</code>表示{<cd1>}应该在<code>v</code>中的第一个轴和{<cd5>}中的第三个轴求和。(还可以看看<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.einsum.html" rel="nofollow">^{<cd6>}</a>,它更灵活,但如果不习惯这种表示法,则更难理解。)</p>
<p>如果考虑速度,<code>tensordot</code>要比对小数组使用<code>apply_along_axes</code>快得多。在</p>
<pre><code>In [14]: A = np.ones((3,3,2))
In [15]: v = np.array([1,2])
In [16]: %timeit np.tensordot(v, A, axes=(0, 2))
10000 loops, best of 3: 21.6 us per loop
In [17]: %timeit np.apply_along_axis(v.dot, 2, A)
1000 loops, best of 3: 258 us per loop
</code></pre>
<p>(尽管<code>tensordot</code>总是更快,但由于开销恒定,对于大型数组来说,这种差异不太明显。)</p>