Python Numpy:m的子矩阵m的有效和

Python Numpy:m的子矩阵m的有效和,python,numpy,matrix,Python,Numpy,Matrix,如果我知道每个方子矩阵m(2x2)的维数,并且一个大方阵m的维数可以被维数m整除:m模m==0 是否有一种有效的方法将以下矩阵M求和: M = array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]]) 结果是: M' = array([[ 4., 4.], [ 4.,

如果我知道每个方子矩阵m(2x2)的维数,并且一个大方阵m的维数可以被维数m整除:m模m==0

是否有一种有效的方法将以下矩阵M求和:

M = array([[ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.]])
结果是:

M' = array([[ 4.,  4.],
            [ 4.,  4.])
其中M'中的(0,0)是M'中的(0,0)、(0,1)、(1,0)、(1,1)之和


我发现for循环在这里非常慢。

这里有一个可能的解决方案

import numpy as np
import itertools

>>> x = np.arange(16).reshape((4,4))
>>> x
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> for i, j in itertools.product([0,2],[0,2]):
...     print np.sum(x[i:i+2,j:j+2])
... 
10
18
42
50
>>> 
找到了一个优雅的解决方案


这里有一个可能的解决办法

import numpy as np
import itertools

>>> x = np.arange(16).reshape((4,4))
>>> x
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> for i, j in itertools.product([0,2],[0,2]):
...     print np.sum(x[i:i+2,j:j+2])
... 
10
18
42
50
>>> 
找到了一个优雅的解决方案


可以使用矩阵乘法。取这个矩阵x=[[1,1,0,0],[0,0,1,1]]。那么M'=x.dot(M.dot(x.T))可以使用矩阵乘法。取这个矩阵x=[[1,1,0,0],[0,0,1,1]]。那么M'=x.dot(M.dot(x.T))