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+108.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]])