我们可以使用^{}作为矢量化的解决方案-(A[...,None]*B[:,None]).reshape(A.shape[0],-1)
哲学:在矢量化/广播语言方面,我将其描述为扩展或将输入数组的第二维度相互对立,同时保持其第一维度对齐。这种扩展是通过为这两个输入引入带有^{}的新轴,然后简单地相互相乘来完成的。在
数学视图:让我们借助一个通用的示例,使用一个更为数学化的视图。考虑具有不同列数的输入数组-
^{pr2}$
首先,扩展尺寸并检查其形状-In [506]: A[...,None].shape
Out[506]: (2, 3, 1)
In [507]: B[:,None].shape
Out[507]: (2, 1, 4)
现在,执行元素级乘法,它将以广播方式执行这些乘法。仔细看看输出的形状-In [508]: (A[...,None]*B[:,None]).shape
Out[508]: (2, 3, 4)
因此,使用None/np.newaxis引入的单粒子维数(长度为1的维)将是在相乘之前相应数组的元素将在引擎盖下广播的那些维度。这种引擎盖下的广播与相应的操作(在这种情况下是乘法)以非常有效的方式进行。在
最后,我们将这个3D数组重塑为2D,保持与原始输入相同的行数。在
样本运行: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(