Python Numpy:m的子矩阵m的有效和
如果我知道每个方子矩阵m(2x2)的维数,并且一个大方阵m的维数可以被维数m整除:m模m==0 是否有一种有效的方法将以下矩阵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 = 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))