我们可以将broadcasting 用于矢量化解决方案 -
(A[...,None]*B[:,None]).reshape(A.shape[0],-1)
哲学:就矢量化/广播语言而言,我将其描述为传播或将输入数组的第二维相互对立,同时保持它们的第一维尺寸对齐。这种传播是通过为这两个输入引入带有None/np.newaxis 的新轴然后简单地相互相乘来完成的。
数学视图:让我们借助一个通用示例来使用更多的数学视图。考虑具有不同列数的输入数组 -
In [504]: A = np.random.rand(2,3)
In [505]: B = np.random.rand(2,4)
首先,扩展尺寸并检查它们的形状 -
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(A.shape[0],-1)
Out[496]:
array([[24, 26, 36, 39],
[56, 60, 70, 75]])
NumPy matrix 输入输入
对于NumPy matrix types 作为输入,我们可以使用np.asmatrix,它只会在输入中创建视图。使用这些视图,将执行广播的逐元素乘法,最终在整形后产生2D 数组。所以,最后一步是转换回np.matrix 类型。让我们使用相同的示例输入来演示实现 -
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]])