Разделите и поменяйте местами элементы от N-го измерения до N-го + 1 измерения - PullRequest
1 голос
/ 05 октября 2019

Допустим, у меня был такой массив:

[[[ 1,  2,  3,  4],
  [ 5,  6,  7,  8],
  [ 9, 10, 11, 12],
  [13, 14, 15, 16]]]

, который имеет размеры (1, 4, 4)

, и я хотел преобразовать его в:

[[[[ 1,  3], [ 2,  4]],
  [[ 5,  7], [ 6,  8]],
  [[ 9, 11], [10, 12]],
  [[13, 15], [14, 16]]]]

Которые имеют размеры (1, 4, 2, 2).

Есть ли в numpy какая-либо функция, которую я мог бы использовать для изменения массива как такового?

  • array.reshape () закрыта, но не полностью, потому что не может поменять местами элементы.

Я хочу не использовать прямой python, так как этот код используется для форматирования некоторых данных для нейронной сети. сетевой вход, и скорость Python (учитывая размер фактических массивов), вероятно, будет узким местом.

Ответы [ 3 ]

1 голос
/ 05 октября 2019

Вы совсем близко. Единственное, что вам нужно сделать, это поменять местами третью и четвертую оси:

>>> np.swapaxes(a.reshape(1,4,2,2), 2,3)
array([[[[ 1,  3],
         [ 2,  4]],

        [[ 5,  7],
         [ 6,  8]],

        [[ 9, 11],
         [10, 12]],

        [[13, 15],
         [14, 16]]]])
1 голос
/ 05 октября 2019

Вы можете попросить Reshape использовать ордер FORTRAN:

a = np.arange(1,17).reshape(1,4,4)

a.reshape(*a.shape[:-1],2,2,order="F")
# array([[[[ 1,  3],
#          [ 2,  4]],
# 
#         [[ 5,  7],
#          [ 6,  8]],
# 
#         [[ 9, 11],
#          [10, 12]],
# 
#         [[13, 15],
#          [14, 16]]]])
1 голос
/ 05 октября 2019

Разделить последнюю ось, затем переставить оси -

In [41]: a
Out[41]: 
array([[[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12],
        [13, 14, 15, 16]]])

In [42]: a.reshape(-1,2,2).swapaxes(1,2)
Out[42]: 
array([[[ 1,  3],
        [ 2,  4]],

       [[ 5,  7],
        [ 6,  8]],

       [[ 9, 11],
        [10, 12]],

       [[13, 15],
        [14, 16]]])

Если вам нужна конечная выходная форма, равная (1,4,2,2), добавьте новую ось спереди с помощью None/np.newaxis -

In [43]: a.reshape(-1,2,2).swapaxes(1,2)[None]
Out[43]: 
array([[[[ 1,  3],
         [ 2,  4]],

        [[ 5,  7],
         [ 6,  8]],

        [[ 9, 11],
         [10, 12]],

        [[13, 15],
         [14, 16]]]])

In [44]: _.shape
Out[44]: (1, 4, 2, 2)

Для общего случая с известным количеством элементов в списке, скажем, n, это будет -

a.reshape(-1,n,a.shape[-1]//n).swapaxes(1,2)[None]

More info on nd-массивы transformation.

...