2016-11-21 156 views
3

列我有两个矩阵:乘两个矩阵与蟒蛇

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。

在此先感谢。

回答

7

我们可以使用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]]) 
+1

你能解释索引在这里的工作原理吗? –

+0

好奇,但当用'np.matrix()'定义上述2D矩阵并应用广播时 - 给出错误'ValueError:形状太大而不能作为矩阵。' – RomanPerekhrest

+0

@RomanPerekhrest嗯,我假定NumPy数组。也许我应该澄清一下。 – Divakar

1
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 

我希望有一个更好的方式做第三步,但上面的作品,是相对有效。