Python Numpy - объединяет подмассивы с 4D-массивом, не может заставить свапы работать, чтобы построить 2D-глобальный массив - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть массив 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]

Я пытаюсь получить глобальный массив 8x8 из всех блоков 2x2 (всего 16 блоков);Я сделал:

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]

Если бы кто-то мог помочь мне построить массив 2D 8x8 из массива 4D ...

РЕДАКТИРОВАТЬ 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]

Но у меня есть сомнения относительно печати двух первых строк по всему индексу столбца(второй index j в arrayFullCross[i][j][k][l].

К сожалению, почти решение с 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]

Можно ли использовать подмены несколько раз?

С уважением

1 Ответ

0 голосов
/ 12 февраля 2019

Думаю, мои комментарии не были достаточно ясными.

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