【问题标题】:How to efficiently calculate the outer product of two series of matrices in numpy?如何有效地计算numpy中两个系列矩阵的外积?
【发布时间】:2017-01-26 22:47:07
【问题描述】:

假设我有 A(KxMxN) 和 B(KxLxN) 矩阵,其中 L,M,N 很小,K 很大。我想计算使用沿第一个维度的最后两个维度的外积来获得矩阵 C(KxMxL)。

我可以通过为“K”中的每个索引 k 运行一个 for 循环来做到这一点,并将 numpy 的 matmul 函数用于二维矩阵

out = [np.matmul(x,y.T) for x, y in zip(A, B)]
out=np.asarray(out)

我想知道我是否可以在没有 for 循环/理解的情况下做到这一点,因为 K 是一个非常大的数字。

【问题讨论】:

  • 它实际上是一个内积 - 在一组子数组上。外积增加维度,不求和。

标签: python numpy matrix


【解决方案1】:

由于A 的形状为(K, M, N)B 的形状为(K, L, N),并且您希望找到形状为(K, M, L) 的产品的总和,您可以使用np.einsum

C = np.einsum('kmn,kln->kml', A, B)

【讨论】:

    【解决方案2】:

    matmul 有效,在B 中进行了转置,因此其倒数第二个暗淡与A 的最后一个暗淡匹配。

    In [1019]: A=np.random.rand(K,M,N)
    In [1021]: B=np.random.rand(K,L,N)
    
    In [1023]: C=np.einsum('kmn,kln->kml',A,B)
    In [1024]: C.shape
    Out[1024]: (2, 4, 3)
    
    In [1026]: D=A@B.transpose(0,2,1)
    In [1027]: D.shape
    Out[1027]: (2, 4, 3)
    
    In [1028]: np.allclose(C,D)
    Out[1028]: True
    

    对于这个小例子,timeit 是相同的。

    [np.dot(x,y.T) for x, y in zip(A, B)] 做同样的事情;将y 的倒数第二个暗度与x 的倒数匹配,并在AB 的第一个暗度上进行迭代。

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2018-10-06
      相关资源
      最近更新 更多