【问题标题】:Is there a numpy function to get the sum of sub matrices?是否有一个 numpy 函数来获取子矩阵的总和?
【发布时间】:2018-11-06 06:08:07
【问题描述】:

我想得到一个数组,它是数组中子矩阵的总和。

例如,假设我们有一个 3x3 矩阵,其中每个项目包含一个 2x2 子矩阵:

matrix = np.array([[[[1,2],[3,4]],     [[5,6],[7,8]],     [[9,10],[11,12]]],
                   [[[13,14],[15,16]], [[17,18],[19,20]], [[21,22],[23,24]]],
                   [[[25,26],[27,28]], [[29,30],[31,32]], [[33,34],[35,36]]]])

看起来像:

[[[[ 1  2]
   [ 3  4]]

  [[ 5  6]
   [ 7  8]]

  [[ 9 10]
   [11 12]]]


 [[[13 14]
   [15 16]]

  [[17 18]
   [19 20]]

  [[21 22]
   [23 24]]]


 [[[25 26]
   [27 28]]

  [[29 30]
   [31 32]]

  [[33 34]
   [35 36]]]]

获得答案的一种方法是使用列表推导

ans = [ [ np.sum(sub_matrices) for sub_matrices in row ] for row in matrix ]

这将是:

[[10, 26, 42], [58, 74, 90], [106, 122, 138]]

我想知道是否有更好的方法来获得这个结果。也许使用一些内置的 numpy 函数?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    使用einsum,在这种情况下比传统的sum 更快:

    np.einsum('ijkl->ij',matrix)
    
    array([[ 10,  26,  42],
           [ 58,  74,  90],
           [106, 122, 138]])
    

    【讨论】:

    • 确实更快。
    • @klim 是的。
    • 说真的,einsum 很神奇。您有什么地方可以推荐(除了官方文档)来阅读它吗?我永远不会想到在这里使用它。
    • 我很惊讶einsum.sum(axis=(2,3)) 快,即使在这种不涉及临时人员的情况下。
    • 很抱歉仍在尝试熟悉 einsum。 i 和 j 是 3x3 的行和列,k 和 l 是 2x2 矩阵的行和列,对吗?由于在输出端省略了 k 和 l,我们将它们相加吗?顺便说一句,感谢您非常有效的回答。
    【解决方案2】:

    你可以使用.sum两次:

    >>> matrix.sum(axis=2).sum(axis=2)
    array([[ 10,  26,  42],
           [ 58,  74,  90],
           [106, 122, 138]])
    

    或者,更优雅地,正如@hpaulj 所建议的,您可以简单地将一个元组传递给axis 参数:

    >>> matrix.sum(axis=(2,3))
    array([[ 10,  26,  42],
           [ 58,  74,  90],
           [106, 122, 138]])
    

    【讨论】:

    • arr.sum(axis=(2,3))
    • @hpaulj 啊是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2019-10-08
    • 2013-10-10
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多