我想要一个数组,它是数组中子矩阵的和。
例如,假设我们有一个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函数?
答案 0 :(得分:4)
在这种情况下,使用einsum
比常规的sum
更快:
np.einsum('ijkl->ij',matrix)
array([[ 10, 26, 42],
[ 58, 74, 90],
[106, 122, 138]])
答案 1 :(得分: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]])