Python NumPy阵列已重塑,但如何更改池的轴?
我有一个8x8矩阵,如下所示:Python NumPy阵列已重塑,但如何更改池的轴?,python,arrays,numpy,reshape,max-pooling,Python,Arrays,Numpy,Reshape,Max Pooling,我有一个8x8矩阵,如下所示: [[ 0.3 0.3 0.3 0.3 0.3 0.5 0.1 -0.1] [ 0.1 0.1 -0.1 0.3 0.3 -0.1 -0.1 -0.5] [-0.1 0.1 0.3 -0.1 0.3 -0.1 -0.1 -0.1] [-0.1 0.1 0.5 0.3 -0.3 -0.1 -0.3 -0.1] [ 0.5 0.1 -0.1 0.1 -0.1 -0.1 -0.3 -0.5] [ 0.1 -0.1 -0.3 -0
[[ 0.3 0.3 0.3 0.3 0.3 0.5 0.1 -0.1]
[ 0.1 0.1 -0.1 0.3 0.3 -0.1 -0.1 -0.5]
[-0.1 0.1 0.3 -0.1 0.3 -0.1 -0.1 -0.1]
[-0.1 0.1 0.5 0.3 -0.3 -0.1 -0.3 -0.1]
[ 0.5 0.1 -0.1 0.1 -0.1 -0.1 -0.3 -0.5]
[ 0.1 -0.1 -0.3 -0.5 -0.5 -0.1 -0.1 -0.3]
[-0.5 -0.3 -0.3 -0.3 -0.1 -0.5 -0.1 -0.3]
[-0.3 -0.3 -0.3 -0.3 -0.1 -0.1 -0.5 -0.3]]
我的窗户是2x2。我想做的是把四个数字放在一起,上下组合。示例输出如下所示:
[[0.3 0.3
0.1 0.1]
[0.3 0.3
-0.1 0.3]
.......
.......
[-0.1 -0.3
-0.5 -0.3]]
我使用的是打印arr.reforme16,2,2,但我不理解的是如何设置轴以满足此要求。我的输出是:
[[[ 0.3 0.3]
[ 0.3 0.3]]
[[ 0.3 0.1]
[ 0.5 -0.1]]
[[ 0.1 -0.1]
[ 0.1 0.3]]
[[ 0.3 -0.1]
[-0.1 -0.5]]
[[-0.1 0.3]
[ 0.1 -0.1]]
[[ 0.3 -0.1]
[-0.1 -0.1]]
[[-0.1 0.5]
[ 0.1 0.3]]
[[-0.3 -0.3]
[-0.1 -0.1]]
[[ 0.5 -0.1]
[ 0.1 0.1]]
[[-0.1 -0.3]
[-0.1 -0.5]]
[[ 0.1 -0.3]
[-0.1 -0.5]]
[[-0.5 -0.1]
[-0.1 -0.3]]
[[-0.5 -0.3]
[-0.3 -0.3]]
[[-0.1 -0.1]
[-0.5 -0.3]]
[[-0.3 -0.3]
[-0.3 -0.3]]
[[-0.1 -0.5]
[-0.1 -0.3]]]
请解释如何将axis应用于此类情况。或者,如果他们是获得最大池的更好方式,请务必提及
注意:所有这些都是针对最大池的。我在python上使用NumPy和SciPy
arr.reshape((4, 2, 4, 2)).transpose((0, 2, 1, 3)).reshape((16, 2, 2))
你想怎么做
编辑:一点解释:第一次重塑将x轴和y轴分别切割为4个2块。这几乎就是您所要求的,只有块位于轴1和轴3上,而不是最后两个。这就是转置的作用。这是数学中矩阵转置的直接推广,它将轴0和1交换到任意维。参数0、2、1、3要求它保留第0个轴和最后一个轴,并交换轴1和2
此时形状为4,4,2,2。因此,最终的重塑会使前两个轴变平。如果您可以使用2x2的4x4块,那么实际上建议不要进行第二次整形,因为与前两次操作相比,这在计算上非常昂贵
这是因为转置创建了一个非连续数组。现在,连续数组和非连续数组之间的一个区别是,重塑连续数组的成本几乎为零,而重塑非连续数组通常会强制复制。确实如此
arr.reshape((4, 2, 4, 2)).transpose((0, 2, 1, 3)).reshape((16, 2, 2))
你想怎么做
编辑:一点解释:第一次重塑将x轴和y轴分别切割为4个2块。这几乎就是您所要求的,只有块位于轴1和轴3上,而不是最后两个。这就是转置的作用。这是数学中矩阵转置的直接推广,它将轴0和1交换到任意维。参数0、2、1、3要求它保留第0个轴和最后一个轴,并交换轴1和2
此时形状为4,4,2,2。因此,最终的重塑会使前两个轴变平。如果您可以使用2x2的4x4块,那么实际上建议不要进行第二次整形,因为与前两次操作相比,这在计算上非常昂贵
这是因为转置创建了一个非连续数组。现在,连续阵列和非连续阵列之间的一个区别是,重塑连续阵列的成本几乎为零,而重塑非连续阵列通常会强制复制。重塑将两个轴中的每个轴拆分为两个轴,使后一个轴的长度与块大小相同。这将给我们一个4D阵列。然后,沿后两个轴执行最大查找,这将是4D阵列中的第二个和第四个轴 因此,简单地做-
m,n = a.shape
out = a.reshape(m//2,2,n//2,2).max(axis=(1,3))
样本运行-
In [50]: a
Out[50]:
array([[87, 96, 46, 97, 25, 22, 13, 16],
[65, 62, 68, 87, 52, 80, 26, 82],
[27, 82, 50, 20, 11, 14, 94, 23],
[86, 44, 17, 97, 17, 57, 76, 42],
[47, 85, 30, 61, 55, 87, 11, 35],
[36, 11, 29, 45, 16, 54, 40, 77],
[38, 87, 94, 77, 53, 20, 46, 18],
[86, 50, 17, 23, 91, 23, 25, 11]])
In [51]: m,n = a.shape
In [52]: a.reshape(m//2,2,n//2,2).max(axis=(1,3))
Out[52]:
array([[96, 97, 80, 82],
[86, 97, 57, 94],
[85, 61, 87, 77],
[87, 94, 91, 46]])
将两个轴中的每个轴拆分为两个轴,使拆分轴中的后一个轴的长度与块大小相同。这将给我们一个4D阵列。然后,沿后两个轴执行最大查找,这将是4D阵列中的第二个和第四个轴 因此,简单地做-
m,n = a.shape
out = a.reshape(m//2,2,n//2,2).max(axis=(1,3))
样本运行-
In [50]: a
Out[50]:
array([[87, 96, 46, 97, 25, 22, 13, 16],
[65, 62, 68, 87, 52, 80, 26, 82],
[27, 82, 50, 20, 11, 14, 94, 23],
[86, 44, 17, 97, 17, 57, 76, 42],
[47, 85, 30, 61, 55, 87, 11, 35],
[36, 11, 29, 45, 16, 54, 40, 77],
[38, 87, 94, 77, 53, 20, 46, 18],
[86, 50, 17, 23, 91, 23, 25, 11]])
In [51]: m,n = a.shape
In [52]: a.reshape(m//2,2,n//2,2).max(axis=(1,3))
Out[52]:
array([[96, 97, 80, 82],
[86, 97, 57, 94],
[85, 61, 87, 77],
[87, 94, 91, 46]])
谢谢你的回复。这是一种更简单易懂的方法。再次感谢你们,谢谢你们的回复。这是一种更简单易懂的方法。再次感谢您。这项工作是格式化的,但会使最大值的提取变得更加复杂和难以处理。谢谢你的回答真的很有帮助。这项工作的格式,但使拉最大更复杂和难以处理。谢谢你的回答真的很有帮助。