Поменяйте местами пару элементов по оси - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть двумерный массив с номерами:

import numpy as np

a = np.arange(20).reshape((2,10))

# array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
#   [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

Я хочу поменять пары элементов в каждой строке. Желаемый результат выглядит следующим образом:

# array([[ 9, 0, 2,  1,  4,  3,  6,  5,  8,  7],
#   [19, 10, 12, 11, 14, 13, 16, 15, 18, 17]])

Мне удалось найти решение в 1d:

a = np.arange(10)

# does the job for all pairs except the first
output = np.roll(np.flip(np.roll(a,-1).reshape((-1,2)),1).flatten(),2)

# first pair done manually
output[0] = a[-1]
output[1] = a[0]

Есть идеи по поводу решения "только для numpy" для случая 2d?

1 Ответ

2 голосов
/ 30 сентября 2019

Из-за того, что первая пара не совсем подписывается на обычный обмен парами, мы можем сделать это отдельно. В остальном, он был бы относительно прямым с изменением формы на разделенные оси и оборотную ось. Следовательно, это будет -

In [42]: a # 2D input array
Out[42]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

In [43]: b2 = a[:,1:-1].reshape(a.shape[0],-1,2)[...,::-1].reshape(a.shape[0],-1)

In [44]: np.hstack((a[:,[-1,0]],b2))
Out[44]: 
array([[ 9,  0,  2,  1,  4,  3,  6,  5,  8,  7],
       [19, 10, 12, 11, 14, 13, 16, 15, 18, 17]])

В качестве альтернативы, стек, а затем reshape + flip-axis -

In [50]: a1 = np.hstack((a[:,[0,-1]],a[:,1:-1]))

In [51]: a1.reshape(a.shape[0],-1,2)[...,::-1].reshape(a.shape[0],-1)
Out[51]: 
array([[ 9,  0,  2,  1,  4,  3,  6,  5,  8,  7],
       [19, 10, 12, 11, 14, 13, 16, 15, 18, 17]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...