добавить левую и правую части массива симметрично - python - PullRequest
0 голосов
/ 22 октября 2019
a = np.array([[[ 1, 11],
               [ 3, 13],
               [ 5, 15],
               [ 7, 17],
               [ 9, 19]],

              [[ 2, 12],
               [ 4, 14],
               [ 6, 16],
               [ 8, 18],
               [10, 20]]])

Я пытаюсь добавить левую часть к правой части массива симметрично вдоль второго измерения (поэтому 1+9, 11+19, 3+7, 13+17 для первоговложенный массив выше).

Я пробовал это

>>> middle = int(np.ceil(a.shape[1]/2))
>>> a[:,:middle-1,:] + a[:,middle:,:]
array([[[ 8, 28],
        [12, 32]],

       [[10, 30],
        [14, 34]]], dtype=uint8)

, который добавляет слева направо, но не симметрично. Это то, что я надеюсь получить

array([[[10, 30],
        [10, 30]],

       [[12, 32],
        [12, 32]]], dtype=uint8)

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Похоже, вы можете инвертировать массив, добавить и вырезать в a.shape[1]//2 middle

(a + a[:,::-1,:])[:, :a.shape[1]//2, :]

array([[[10, 30],
        [10, 30]],

       [[12, 32],
        [12, 32]]])
1 голос
/ 22 октября 2019

Вы можете использовать обратную нарезку "[b:a:-1]"

i,j,k = a.shape
a[:,:j//2] + a[:,:(j-1)//2:-1]
# array([[[10, 30],
#         [10, 30]],
#
#        [[12, 32],
#         [12, 32]]])

Или чтобы избежать слегка ошибочных вычислений обратных ограничений, вы можете использовать np.fliplr

half = np.s_[:,:a.shape[1]//2]
a[half] + np.fliplr(a)[half]
# array([[[10, 30],
#         [10, 30]],
#
#        [[12, 32],
#         [12, 32]]])
1 голос
/ 22 октября 2019

Небольшая модификация вашего кода будет работать:

middle = int(np.ceil(a.shape[1]/2))
print(a[:,:middle-1,:] + a[:,:middle-1:-1,:])

Второй адденд разрезан здесь по-разному, чтобы изменить его. (Оригинал был a[:,middle:,:])

Результат:

[[[10 30]
  [10 30]]

 [[12 32]
  [12 32]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...