我想我的评论还不够清楚。
In [811]: arr = np.ones((4,4,2,2),int)
In [812]: arr.swapaxes(0,2).shape
Out[812]: (2, 4, 4, 2)
是的,这可以被重塑为(8,8),但肯定会有某种转换,因为一对维度是(2,4),另一对是(4,2)。
如果您交换了轴以生成(2,4,2,4)或(4,2,4,2),我希望重新整形是正确的。
哪个交换是正确的,具体细节取决于您希望如何划分子块。希望你能追踪到这些?
用尼斯(2,2)块制作一个简单的数组:
In [813]: arr = np.arange(4).reshape(2,2)
In [815]: arr1 =np.tile(arr[None,None,:,:],(4,4,1,1))
In [816]: arr1.shape
Out[816]: (4, 4, 2, 2)
In [817]: arr1
Out[817]:
array([[[[0, 1],
[2, 3]],
[[0, 1],
[2, 3]],
...
看看不同的掉期产生了什么:
In [822]: arr1.swapaxes(0,2).reshape(8,8)
Out[822]:
array([[0, 1, 0, 1, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 1, 0, 1],
[2, 3, 2, 3, 2, 3, 2, 3],
[2, 3, 2, 3, 2, 3, 2, 3],
[2, 3, 2, 3, 2, 3, 2, 3],
[2, 3, 2, 3, 2, 3, 2, 3]])
In [823]:
In [823]: arr1.swapaxes(1,3).reshape(8,8)
Out[823]:
array([[0, 0, 0, 0, 2, 2, 2, 2],
[1, 1, 1, 1, 3, 3, 3, 3],
[0, 0, 0, 0, 2, 2, 2, 2],
[1, 1, 1, 1, 3, 3, 3, 3],
[0, 0, 0, 0, 2, 2, 2, 2],
[1, 1, 1, 1, 3, 3, 3, 3],
[0, 0, 0, 0, 2, 2, 2, 2],
[1, 1, 1, 1, 3, 3, 3, 3]])
In [824]: arr1.swapaxes(1,2).reshape(8,8)
Out[824]:
array([[0, 1, 0, 1, 0, 1, 0, 1],
[2, 3, 2, 3, 2, 3, 2, 3],
[0, 1, 0, 1, 0, 1, 0, 1],
[2, 3, 2, 3, 2, 3, 2, 3],
[0, 1, 0, 1, 0, 1, 0, 1],
[2, 3, 2, 3, 2, 3, 2, 3],
[0, 1, 0, 1, 0, 1, 0, 1],
[2, 3, 2, 3, 2, 3, 2, 3]])
工作时产生(4,2,4,2)形状:
In [825]: arr1.swapaxes(0,2).shape
Out[825]: (2, 4, 4, 2)
In [826]: arr1.swapaxes(1,3).shape
Out[826]: (4, 2, 2, 4)
In [827]: arr1.swapaxes(1,2).shape
Out[827]: (4, 2, 4, 2)
还有另一个交换
In [829]: arr1.swapaxes(0,3).shape
Out[829]: (2, 4, 2, 4)
In [830]: arr1.swapaxes(0,3).reshape(8,8)
Out[830]:
array([[0, 0, 0, 0, 2, 2, 2, 2],
[0, 0, 0, 0, 2, 2, 2, 2],
[0, 0, 0, 0, 2, 2, 2, 2],
[0, 0, 0, 0, 2, 2, 2, 2],
[1, 1, 1, 1, 3, 3, 3, 3],
[1, 1, 1, 1, 3, 3, 3, 3],
[1, 1, 1, 1, 3, 3, 3, 3],
[1, 1, 1, 1, 3, 3, 3, 3]])