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.
提前致谢.
我们可以使用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)
归档时间: |
|
查看次数: |
622 次 |
最近记录: |