乘两个矩阵与蟒蛇
问题描述:
列我有两个矩阵:乘两个矩阵与蟒蛇
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
数组重新排列为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]])
答
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
我希望有一个更好的方式做第三步,但上面的作品,是相对有效。
你能解释索引在这里的工作原理吗? –
好奇,但当用'np.matrix()'定义上述2D矩阵并应用广播时 - 给出错误'ValueError:形状太大而不能作为矩阵。' – RomanPerekhrest
@RomanPerekhrest嗯,我假定NumPy数组。也许我应该澄清一下。 – Divakar