Python Numpy - 将子数组与 4D 数组合并,无法让 swapaxes 工作以构建 2D 全局数组
Python Numpy - Merge subarrays with a 4D array, can't get swapaxes working to build a 2D global array
我有一个 8x8 数组,分为 2x2 块,所以我有 16 个子数组。 4 个维度是 (4,4,2,2):第一个是块的行,第二个是它的列,第三个是子数组 2x2 的行索引,第四个是子数组 2x2 的列索引。
全局数组的前 2 行是(2 行 8 列):
[3.28542331e+09 3.28542331e+09 0. 0. 0. 0. 0. 0]
[0. 0. 2.60113771e+10 2.60113771e+10 5.12629421e+10 5.12629421e+10 8.49990653e+10 8.49990653e+10]
我尝试从所有 2x2 块(总共 16 个块)中获取一个 8x8 全局数组;我做到了:
arrayFullCross.swapaxes(0,2).reshape(8,8)
但这行不通。事实上,第一行是正确的,但第二行不是。这是我得到的:
reshape = [[3.28542331e+09 3.28542331e+09 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
...
如您所见,值 5.12629421e+10 5.12629421e+10
和 8.49990653e+10 8.49990653e+10
没有出现在第二行。
它们出现在第三行:
[0.00000000e+00 0.00000000e+00 5.12629421e+10 5.12629421e+10
1.01028455e+11 1.01028455e+11 0.00000000e+00 0.00000000e+00]
相反,我想上第二行:
[[3.28542331e+09 3.28542331e+09 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
5.12629421e+10 5.12629421e+10 8.49990653e+10 8.49990653e+10]
我想从 4D 数组构建一个 2D 8x8 数组。
编辑 1
下面是完整 4D 阵列的打印(通过 print 'arrayFullCross = ', arrayFullCross
):
arrayFullCross = [[[[3.28542331e+09 3.28542331e+09]
[8.97951610e+07 8.97951610e+07]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]]
[[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[2.60113771e+10 2.60113771e+10]
[7.10926896e+08 7.10926896e+08]]
[[5.12629421e+10 5.12629421e+10]
[1.40108708e+09 1.40108708e+09]]
[[8.49990653e+10 8.49990653e+10]
[2.32314196e+09 2.32314196e+09]]]
[[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[1.01028455e+11 1.01028455e+11]
[2.76124733e+09 2.76124733e+09]]
[[1.67515243e+11 1.67515243e+11]
[4.57842318e+09 4.57842318e+09]]]
[[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[1.38878482e+11 1.38878482e+11]
[3.79574089e+09 3.79574089e+09]]]]
编辑 2
好的,我必须检查重塑是否完成的方法是:
print 'shape(arrayFull = ', np.shape(arrayFullCross)
print 'here first line , arrayFullCross column = 0 = ', arrayFullCross[0][0][0][0:2]
print 'here first line , arrayFullCross column = 1 = ', arrayFullCross[0][1][0][0:2]
print 'here first line , arrayFullCross column = 2 = ', arrayFullCross[0][2][0][0:2]
print 'here first line , arrayFullCross column = 3 = ', arrayFullCross[0][3][0][0:2]
print ' '
print 'here second line , arrayFullCross column = 0 = ', arrayFullCross[1][0][0][0:2]
print 'here second line , arrayFullCross column = 1 = ', arrayFullCross[1][1][0][0:2]
print 'here second line , arrayFullCross column = 2 = ', arrayFullCross[1][2][0][0:2]
print 'here second line , arrayFullCross column = 3 = ', arrayFullCross[1][3][0][0:2]
print ' '
print 'test all first line , arrayFullCross column = 0,1,2,3 = ', arrayFullCross[0][0:4][0][0:2]
print ' '
print 'here first line , arrayFullCross column = 1 = ', arrayFullCross[0][1][0][0:2]
print 'here first line , arrayFullCross column = 2 = ', arrayFullCross[0][2][0][0:2]
print 'here first line , arrayFullCross column = 3 = ', arrayFullCross[0][3][0][0:2]
给出:
shape(arrayFull = (4, 4, 2, 2)
here first line , arrayFullCross column = 0 = [3.28542331e+09 3.28542331e+09]
here first line , arrayFullCross column = 1 = [0. 0.]
here first line , arrayFullCross column = 2 = [0. 0.]
here first line , arrayFullCross column = 3 = [0. 0.]
here second line , arrayFullCross column = 0 = [0. 0.]
here second line , arrayFullCross column = 1 = [2.60113771e+10 2.60113771e+10]
here second line , arrayFullCross column = 2 = [5.12629421e+10 5.12629421e+10]
here second line , arrayFullCross column = 3 = [8.49990653e+10 8.49990653e+10]
但我对沿着列索引(arrayFullCross[i][j][k][l]
中的第二个 index j
)打印前两行有疑问。
不幸的是,几乎解决方案与print 'reshape = ', arrayFullCross.swapaxes(2,0).reshape(8,8)
给出:
reshape = [[3.28542331e+09 3.28542331e+09 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 5.12629421e+10 5.12629421e+10
1.01028455e+11 1.01028455e+11 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 8.49990653e+10 8.49990653e+10
1.67515243e+11 1.67515243e+11 1.38878482e+11 1.38878482e+11]
[8.97951610e+07 8.97951610e+07 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 7.10926896e+08 7.10926896e+08
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 1.40108708e+09 1.40108708e+09
2.76124733e+09 2.76124733e+09 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.32314196e+09 2.32314196e+09
4.57842318e+09 4.57842318e+09 3.79574089e+09 3.79574089e+09]]
根据我的打印,第二行应该等于:
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
5.12629421e+10 5.12629421e+10 8.49990653e+10 8.49990653e+10]
是否可以多次使用交换轴?
我猜我的评论不够清楚。
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]])
我有一个 8x8 数组,分为 2x2 块,所以我有 16 个子数组。 4 个维度是 (4,4,2,2):第一个是块的行,第二个是它的列,第三个是子数组 2x2 的行索引,第四个是子数组 2x2 的列索引。
全局数组的前 2 行是(2 行 8 列):
[3.28542331e+09 3.28542331e+09 0. 0. 0. 0. 0. 0]
[0. 0. 2.60113771e+10 2.60113771e+10 5.12629421e+10 5.12629421e+10 8.49990653e+10 8.49990653e+10]
我尝试从所有 2x2 块(总共 16 个块)中获取一个 8x8 全局数组;我做到了:
arrayFullCross.swapaxes(0,2).reshape(8,8)
但这行不通。事实上,第一行是正确的,但第二行不是。这是我得到的:
reshape = [[3.28542331e+09 3.28542331e+09 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
...
如您所见,值 5.12629421e+10 5.12629421e+10
和 8.49990653e+10 8.49990653e+10
没有出现在第二行。
它们出现在第三行:
[0.00000000e+00 0.00000000e+00 5.12629421e+10 5.12629421e+10
1.01028455e+11 1.01028455e+11 0.00000000e+00 0.00000000e+00]
相反,我想上第二行:
[[3.28542331e+09 3.28542331e+09 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
5.12629421e+10 5.12629421e+10 8.49990653e+10 8.49990653e+10]
我想从 4D 数组构建一个 2D 8x8 数组。
编辑 1
下面是完整 4D 阵列的打印(通过 print 'arrayFullCross = ', arrayFullCross
):
arrayFullCross = [[[[3.28542331e+09 3.28542331e+09]
[8.97951610e+07 8.97951610e+07]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]]
[[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[2.60113771e+10 2.60113771e+10]
[7.10926896e+08 7.10926896e+08]]
[[5.12629421e+10 5.12629421e+10]
[1.40108708e+09 1.40108708e+09]]
[[8.49990653e+10 8.49990653e+10]
[2.32314196e+09 2.32314196e+09]]]
[[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[1.01028455e+11 1.01028455e+11]
[2.76124733e+09 2.76124733e+09]]
[[1.67515243e+11 1.67515243e+11]
[4.57842318e+09 4.57842318e+09]]]
[[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00]]
[[1.38878482e+11 1.38878482e+11]
[3.79574089e+09 3.79574089e+09]]]]
编辑 2
好的,我必须检查重塑是否完成的方法是:
print 'shape(arrayFull = ', np.shape(arrayFullCross)
print 'here first line , arrayFullCross column = 0 = ', arrayFullCross[0][0][0][0:2]
print 'here first line , arrayFullCross column = 1 = ', arrayFullCross[0][1][0][0:2]
print 'here first line , arrayFullCross column = 2 = ', arrayFullCross[0][2][0][0:2]
print 'here first line , arrayFullCross column = 3 = ', arrayFullCross[0][3][0][0:2]
print ' '
print 'here second line , arrayFullCross column = 0 = ', arrayFullCross[1][0][0][0:2]
print 'here second line , arrayFullCross column = 1 = ', arrayFullCross[1][1][0][0:2]
print 'here second line , arrayFullCross column = 2 = ', arrayFullCross[1][2][0][0:2]
print 'here second line , arrayFullCross column = 3 = ', arrayFullCross[1][3][0][0:2]
print ' '
print 'test all first line , arrayFullCross column = 0,1,2,3 = ', arrayFullCross[0][0:4][0][0:2]
print ' '
print 'here first line , arrayFullCross column = 1 = ', arrayFullCross[0][1][0][0:2]
print 'here first line , arrayFullCross column = 2 = ', arrayFullCross[0][2][0][0:2]
print 'here first line , arrayFullCross column = 3 = ', arrayFullCross[0][3][0][0:2]
给出:
shape(arrayFull = (4, 4, 2, 2)
here first line , arrayFullCross column = 0 = [3.28542331e+09 3.28542331e+09]
here first line , arrayFullCross column = 1 = [0. 0.]
here first line , arrayFullCross column = 2 = [0. 0.]
here first line , arrayFullCross column = 3 = [0. 0.]
here second line , arrayFullCross column = 0 = [0. 0.]
here second line , arrayFullCross column = 1 = [2.60113771e+10 2.60113771e+10]
here second line , arrayFullCross column = 2 = [5.12629421e+10 5.12629421e+10]
here second line , arrayFullCross column = 3 = [8.49990653e+10 8.49990653e+10]
但我对沿着列索引(arrayFullCross[i][j][k][l]
中的第二个 index j
)打印前两行有疑问。
不幸的是,几乎解决方案与print 'reshape = ', arrayFullCross.swapaxes(2,0).reshape(8,8)
给出:
reshape = [[3.28542331e+09 3.28542331e+09 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 5.12629421e+10 5.12629421e+10
1.01028455e+11 1.01028455e+11 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 8.49990653e+10 8.49990653e+10
1.67515243e+11 1.67515243e+11 1.38878482e+11 1.38878482e+11]
[8.97951610e+07 8.97951610e+07 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 7.10926896e+08 7.10926896e+08
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 1.40108708e+09 1.40108708e+09
2.76124733e+09 2.76124733e+09 0.00000000e+00 0.00000000e+00]
[0.00000000e+00 0.00000000e+00 2.32314196e+09 2.32314196e+09
4.57842318e+09 4.57842318e+09 3.79574089e+09 3.79574089e+09]]
根据我的打印,第二行应该等于:
[0.00000000e+00 0.00000000e+00 2.60113771e+10 2.60113771e+10
5.12629421e+10 5.12629421e+10 8.49990653e+10 8.49990653e+10]
是否可以多次使用交换轴?
我猜我的评论不够清楚。
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]])