用python将两列矩阵乘以

Die*_*oDZ 4 python numpy matrix vectorization

我有两个矩阵:

A = [a11 a12 

     a21 a22]


B = [b11 b12
     b21 b22]
Run Code Online (Sandbox Code Playgroud)

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

C =[a11*b11   a11*b12   a12*b11   a12*b12
    a21*b21   a21*b22   a22*b21   a22*b22]
Run Code Online (Sandbox Code Playgroud)

我试过了

>>> C = np.prod(A,B,axis=0)
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Div*_*kar 8

我们可以使用broadcasting矢量化解决方案 -

(A[...,None]*B[:,None]).reshape(A.shape[0],-1)
Run Code Online (Sandbox Code Playgroud)

哲学:在矢量化/广播语言方面,我将其描述为输入数组的第二维扩展或放置在彼此之间,同时保持它们的第一维对齐.通过None/np.newaxis为这两个输入引入新轴然后简单地相互相乘来完成这种扩展.

数学观点:让我们在一般例子的帮助下使用它的更多数学观点.考虑具有不同列数的输入数组 -

In [504]: A = np.random.rand(2,3)

In [505]: B = np.random.rand(2,4)
Run Code Online (Sandbox Code Playgroud)

首先,扩展尺寸并检查其形状 -

In [506]: A[...,None].shape
Out[506]: (2, 3, 1)

In [507]: B[:,None].shape
Out[507]: (2, 1, 4)
Run Code Online (Sandbox Code Playgroud)

现在,执行逐元素乘法,它将以广播方式执行这些乘法.仔细看看输出的形状 -

In [508]: (A[...,None]*B[:,None]).shape
Out[508]: (2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

因此,通过使用引入的单体尺寸(长度= 1的尺寸)None/np.newaxis将是各个阵列的元件在被乘以之前在引擎盖下广播的尺寸.这种引擎盖下的广播与相应的操作(在这种情况下相乘)配对是以非常有效的方式完成的.

最后,我们重塑此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]])
Run Code Online (Sandbox Code Playgroud)

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]])
Run Code Online (Sandbox Code Playgroud)