如果我们形成整形矩阵
y = x.reshape(2,2,3,2),则(i,j)2x2子矩阵由给出
y[i,:,j,:]。例如:
In [340]: xOut[340]: array([[ 0., 1., 2., 3., 4., 5.], [ 6., 7., 8., 9., 10., 11.], [ 12., 13., 14., 15., 16., 17.], [ 18., 19., 20., 21., 22., 23.]])In [341]: y = x.reshape(2,2,3,2)In [342]: y[0,:,0,:]Out[342]: array([[ 0., 1.], [ 6., 7.]])In [343]: y[1,:,2,:]Out[343]: array([[ 16., 17.], [ 22., 23.]])
要获得2x2子矩阵的均值,请使用配合以下
mean方法
axis=(1,3):
In [344]: y.mean(axis=(1,3))Out[344]: array([[ 3.5, 5.5, 7.5], [ 15.5, 17.5, 19.5]])
如果您使用的numpy较旧版本不支持在轴上使用元组,则可以执行以下操作:
In [345]: y.mean(axis=1).mean(axis=-1)Out[345]: array([[ 3.5, 5.5, 7.5], [ 15.5, 17.5, 19.5]])
请参阅@dashesy在评论中给出的链接,以获取有关重塑“技巧”的更多背景信息。
要将其推广为形状为(m,n)的二维数组,其中m和n为偶数,请使用
y = x.reshape(x.shape[0]/2, 2, x.shape[1], 2)
y然后可以解释为2x2数组的数组。4-d阵列的第一和第三索引槽用作选择2x2块之一的索引。要获得左上2x2块,请使用
y[0, :, 0,:];到第二行和第三列的块中,使用
y[1, :, 2, :];通常,要访问块(j,k),请使用
y[j, :, k, :]。
要计算这些块的均值的简化数组,请使用的
mean方法
axis=(1, 3)(即,第1轴和第3轴的平均值):
avg = y.mean(axis=(1, 3))
这是一个
x形状为(8,10)的示例,因此2x2块的平均值数组的形状为(4,5):
In [10]: np.random.seed(123)In [11]: x = np.random.randint(0, 4, size=(8, 10))In [12]: xOut[12]: array([[2, 1, 2, 2, 0, 2, 2, 1, 3, 2], [3, 1, 2, 1, 0, 1, 2, 3, 1, 0], [2, 0, 3, 1, 3, 2, 1, 0, 0, 0], [0, 1, 3, 3, 2, 0, 3, 2, 0, 3], [0, 1, 0, 3, 1, 3, 0, 0, 0, 2], [1, 1, 2, 2, 3, 2, 1, 0, 0, 3], [2, 1, 0, 3, 2, 2, 2, 2, 1, 2], [0, 3, 3, 3, 1, 0, 2, 0, 2, 1]])In [13]: y = x.reshape(x.shape[0]/2, 2, x.shape[1]/2, 2)
看一下两个2x2块:
In [14]: y[0, :, 0, :]Out[14]: array([[2, 1], [3, 1]])In [15]: y[1, :, 2, :]Out[15]: array([[3, 2], [2, 0]])
计算块的平均值:
In [16]: avg = y.mean(axis=(1, 3))In [17]: avgOut[17]: array([[ 1.75, 1.75, 0.75, 2. , 1.5 ], [ 0.75, 2.5 , 1.75, 1.5 , 0.75], [ 0.75, 1.75, 2.25, 0.25, 1.25], [ 1.5 , 2.25, 1.25, 1.5 , 1.5 ]])



