В python как удалить серию столбцов каждого n-го элемента в массиве numpy 3d? - PullRequest
1 голос
/ 16 февраля 2020

Аналогично этому вопросу , скажем, у меня есть массив 3D Numpy, над которым я добавил для ясности метку комментария:

          #C  C  C  R  R  C  C  C  R  R  C  C  C
    a = [[[10,11,12,13,14,15,16,17,18,19,20,21,22],
          [23,24,25,26,27,28,29,30,31,32,33,34,35]],                

         [[36,37,38,39,40,41,42,43,44,45,46,47,48],
          [48,49,50,51,52,53,54,55,56,57,58,59,60]],

         [[61,62,63,64,65,66,67,68,69,70,71,72,73],
          [74,75,76,77,78,79,80,81,82,83,84,85,86]]]

можно ли удалить столбцы помечены R в одной строке кода? Поэтому удалите два столбца каждый пятый элемент, начиная с индекса 3. В этом случае результирующий массив будет выглядеть следующим образом:

          #C  C  C  C  C  C  C  C  C
    a = [[[10,11,12,15,16,17,20,21,22],
          [23,24,25,28,29,30,33,34,35]],                

          [[36,37,38,41,42,43,46,47,48],
           [48,49,50,53,54,55,58,59,60]],

          [[61,62,63,66,67,68,71,72,73],
           [74,75,76,79,80,81,84,85,86]]]

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

    start = 3
    step = 5
    a = numpy.delete(big, numpy.s_[start:numpy.size(big, 2):step], 2)
    a = numpy.delete(a, numpy.s_[start:numpy.size(a, 2):step - 1], 2)

Но есть ли способ указать диапазон столбцов для удаления и выполнить задачу в одной строке кода?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Очень похоже на linked posted answer there -

In [4]: a[...,np.mod(np.arange(a.shape[-1]),5)<3]
Out[4]: 
array([[[10, 11, 12, 15, 16, 17, 20, 21, 22],
        [23, 24, 25, 28, 29, 30, 33, 34, 35]],

       [[36, 37, 38, 41, 42, 43, 46, 47, 48],
        [48, 49, 50, 53, 54, 55, 58, 59, 60]],

       [[61, 62, 63, 66, 67, 68, 71, 72, 73],
        [74, 75, 76, 79, 80, 81, 84, 85, 86]]])

Или более короткое -

a[...,(np.arange(a.shape[-1])%5)<3]

Обобщение / параметризация -

group_size = 5
ignore_size = 2
out = a[...,(np.arange(a.shape[-1])%group_size)<(group_size-ignore_size)]
0 голосов
/ 16 февраля 2020

Просто выберите нужные индексы:

a=a[:,:,[0,1,2,5,6,7,10,11,12]]

Или, в более общем виде:

a=a[:,:,[i for i in range(13) if i%5 in [0,1,2]]]

вывод:

array([[[10, 11, 12, 15, 16, 17, 20, 21, 22],
        [23, 24, 25, 28, 29, 30, 33, 34, 35]],
       [[36, 37, 38, 41, 42, 43, 46, 47, 48],
        [48, 49, 50, 53, 54, 55, 58, 59, 60]],
       [[61, 62, 63, 66, 67, 68, 71, 72, 73],
        [74, 75, 76, 79, 80, 81, 84, 85, 86]]])
...