python - 用python按列乘​​以两个矩阵

标签 python numpy matrix vectorization

我有两个矩阵:

A = [a11 a12 

     a21 a22]


B = [b11 b12
     b21 b22]

我想乘以它的所有列(没有循环)以获得矩阵:

C =[a11*b11   a11*b12   a12*b11   a12*b12
    a21*b21   a21*b22   a22*b21   a22*b22]

我试过

>>> C = np.prod(A,B,axis=0)

但 prod 不接受两个输入矩阵。既不是 np.matrix.prod。

提前致谢。

最佳答案

我们可以使用 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 数组 reshape 为 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 矩阵 输入类型

对于 NumPy matrix types作为输入,我们可以使用 np.asmatrix那只会创建对输入的 View 。使用这些 View ,将执行广播的逐元素乘法,最终在整形后生成 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]])

关于python - 用python按列乘​​以两个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40721057/

相关文章:

opencv - 如何在 Mat 中查找特定区域中的非零像素

在 C 中创建矩阵

python - 如何使用 Python 集并将字符串作为字典值添加到其中

python - 通过python脚本控制第三方应用程序时等待用户输入

Python 如何使用 numpy 导入 xlsx 文件

python - numpy 数组子类上的操作不需要的包装结果

python - 安装 jupyter notebook 扩展

python - Pandas:如何剪辑数据帧并获取替换值的数量

python - 大网格的 Numpy 索引

matlab - 使用向量选择 matlab 数组的列