<p>我们可以使用<a href="https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html" rel="nofollow noreferrer">^{<cd1>}</a>作为矢量化的解决方案-</p>
<pre><code>(A[...,None]*B[:,None]).reshape(A.shape[0],-1)
</code></pre>
<p><strong>哲学:</strong>在矢量化/广播语言方面,我将其描述为<em>扩展</em>或将输入数组的第二维度相互对立,同时保持其第一维度对齐。这种扩展是通过为这两个输入引入带有<a href="https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#numpy.newaxis" rel="nofollow noreferrer">^{<cd2>}</a>的新轴,然后简单地相互相乘来完成的。在</p>
<p><strong>数学视图:</strong>让我们借助一个通用的示例,使用一个更为数学化的视图。考虑具有不同列数的输入数组-</p>
^{pr2}$
<p>首先,扩展尺寸并检查其形状-</p>
<pre><code>In [506]: A[...,None].shape
Out[506]: (2, 3, 1)
In [507]: B[:,None].shape
Out[507]: (2, 1, 4)
</code></pre>
<p>现在,执行元素级乘法,它将以广播方式执行这些乘法。仔细看看输出的形状-</p>
<pre><code>In [508]: (A[...,None]*B[:,None]).shape
Out[508]: (2, 3, 4)
</code></pre>
<p>因此,使用<code>None/np.newaxis</code>引入的单粒子维数(长度为1的维)将是在相乘之前相应数组的元素将在引擎盖下广播的那些维度。这种引擎盖下的广播与相应的操作(在这种情况下是乘法)以非常有效的方式进行。在</p>
<p>最后,我们将这个<code>3D</code>数组重塑为<code>2D</code>,保持与原始输入相同的行数。在</p>
<p><strong>样本运行:</strong></p>
<pre><code>In [494]: A
Out[494]:
array([[2, 3],
[4, 5]])
In [495]: B
Out[495]:
array([[12, 13],
[14, 15]])
In [496]: (A[...,None]*B[:,None]).reshape(A.shape[0],-1)
Out[496]:
array([[24, 26, 36, 39],
[56, 60, 70, 75]])
</code></pre>
<p><strong><code>NumPy matrix</code>输入类型</strong></p>
<p>对于<a href="https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.matrix.html" rel="nofollow noreferrer">^{<cd7>}</a>作为输入,我们可以使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.asmatrix.html" rel="nofollow noreferrer">^{<cd8>}</a>来简单地为输入创建视图。使用这些视图,将执行广播的元素级乘法,最终在整形之后生成一个<code>2D</code>数组。{cd10>转换为最后一步。让我们使用相同的示例输入来演示实现-</p>
<pre><code>In [553]: A
Out[553]:
matrix([[2, 3],
[4, 5]])
In [554]: B
Out[554]:
matrix([[12, 13],
[14, 15]])
In [555]: arrA = np.asarray(A)
In [556]: arrB = np.asarray(B)
In [557]: np.asmatrix((arrA[...,None]*arrB[:,None]).reshape(A.shape[0],-1))
Out[557]:
matrix([[24, 26, 36, 39],
[56, 60, 70, 75]])
</code></pre>