<p>通过利用<a href="https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html" rel="nofollow noreferrer">^{<cd1>}</a>可以有效地(不使用任何循环)执行此操作,例如:</p>
<pre><code>In [28]: (A[:, np.newaxis] - B).reshape(-1, A.shape[1])
Out[28]:
array([[ -9, -18, -27],
[ -999, -1998, -2997],
[ 11, 22, 5],
[ 90, 180, 270],
[ -900, -1800, -2700],
[ 110, 220, 302]])
</code></pre>
<hr/>
<p>或者,为了比<a href="https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html" rel="nofollow noreferrer">^{<cd1>}</a>快一点的解决方案,我们必须使用<a href="http://numexpr.readthedocs.io/en/latest/intro.html#how-it-works" rel="nofollow noreferrer">numexpr</a>如:</p>
^{pr2}$
<hr/>
<p>另一种效率最低的方法是使用<a href="https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.repeat.html" rel="nofollow noreferrer">np.repeat</a>和{a5}来匹配这两个数组的形状。但是,请注意,这是最低效的,因为当尝试匹配形状时,它会生成<em>副本</em>。在</p>
<pre><code>In [27]: np.repeat(A, B.shape[0], 0) - np.tile(B, (A.shape[0], 1))
Out[27]:
array([[ -9, -18, -27],
[ -999, -1998, -2997],
[ 11, 22, 5],
[ 90, 180, 270],
[ -900, -1800, -2700],
[ 110, 220, 302]])
</code></pre>