向量化Numpy 3D和2D阵列操作

时间:2019-04-21 18:06:22

标签: python numpy multidimensional-array vectorization dot-product

我正在尝试用Python创建K MxN matrices,并用(M,N,K)和{{这两个矩阵存储在numpy C数组A中1}},形状分别为B(K, M)。第一个矩阵计算为(K,N),其中C0 = a0.T x b0a0的第一行,Ab1的第一行,第二个矩阵是{ {1}},依此类推。

现在我正在使用for循环来计算矩阵。

B

由于操作是独立的,所以我想知道是否存在一些避免for循环的pythonic方法。也许我可以对代码进行矢量化处理,但是我看不到如何实现。

1 个答案:

答案 0 :(得分:0)

In [235]: A = np.random.random((10,800)) 
     ...: B = np.random.random((10,500)) 
     ...: C = np.zeros((800,500,10)) 
     ...: for k in range(10): 
     ...:     C[:,:,k] = A[k,:][:,None] @ B[k,:][None,:] 
     ...:                                                                            
In [236]: C.shape                                                                    
Out[236]: (800, 500, 10)

批处理矩阵乘积,然后转置

In [237]: np.allclose((A[:,:,None]@B[:,None,:]).transpose(1,2,0), C)                 
Out[237]: True

但是因为矩阵乘积轴的大小为1,并且没有其他求和,所以广播乘法也一样好:

In [238]: np.allclose((A[:,:,None]*B[:,None,:]).transpose(1,2,0), C)                 
Out[238]: True

执行时间大致相同