用 Python 按列乘两个矩阵

2024-05-12 18:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个矩阵:

A = [a11 a12 

     a21 a22]


B = [b11 b12
     b21 b22]

我想把它的所有列(不带循环)相乘以得到矩阵:

^{pr2}$

我试过了

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

但是prod不接受两个输入矩阵。都不是np.矩阵.产品一

提前谢谢。在


Tags: 产品np矩阵prodaxisb12a21b11
2条回答
b = np.tile(B, 2) # two copies of B, side by side
a = np.tile(A, 2)
a = np.hstack((a[:,::2], a[:,1::2])) # change 1,2,1,2 to 1,1,2,2
a * b # done

我希望有更好的方法来完成第三步,但是上面的方法是有效的。在

我们可以使用^{}作为矢量化的解决方案-

(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(A.shape[0],-1)
Out[496]: 
array([[24, 26, 36, 39],
       [56, 60, 70, 75]])

NumPy matrix输入类型

对于^{}作为输入,我们可以使用^{}来简单地为输入创建视图。使用这些视图,将执行广播的元素级乘法,最终在整形之后生成一个2D数组。{cd10>转换为最后一步。让我们使用相同的示例输入来演示实现-

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]])

相关问题 更多 >