numpy — нарезка 3d-массива, как применить два фрагмента разной длины к определенной оси

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Некоторое время я застрял с вопросом о нарезке массива numpy.

Ниже приведен массив, который у меня есть прямо сейчас:

 a = np.array([[[ 1,  2],
               [ 3,  4],
               [ 5,  6]],
              [[ 7,  8],
               [ 9, 10],
               [11, 12]]]
  

Как я могу использовать нарезку, чтобы получить массив, подобный следующему?

 np.array([[[ 1,  2]],
          [[ 9, 10],
           [11, 12]]]
  

Я пробовал a[[0,1],[0,[1,2]] , однако это не сработало и выдало ошибку:
ValueError: setting an array element with a sequence.

Заранее благодарю вас!

Комментарии:

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

2. Ваш результирующий блок будет представлять собой массив из 1d 2 элементов, содержащий массив (1,2) и (2,2) (или списки). Вам просто нужно взять два фрагмента по отдельности.

3. @hpaulj Это вроде того, что я подумал. Хотя спасибо!

Ответ №1:

Точная вещь, которую вы предоставляете в качестве желаемого результата, невозможна, поскольку массивы должны быть «гиперпрямоугольниками», поэтому X[0].shape должно быть таким же, как X[1].shape .

Что вы можете сделать, это:

 a[[0,1,1],[0,1,2]]
# array([[ 1,  2],
#        [ 9, 10],
#        [11, 12]])
  

Комментарии:

1. Спасибо за ваш ответ. Принял это, поскольку это работает для меня и было самым ранним.

Ответ №2:

Вы можете сделать это, например:

 import numpy as np
a = np.array([[[ 1,  2], [ 3,  4], [ 5,  6]], [[ 7,  8], [ 9, 10], [11, 12]]])



print(np.array([[a[0, 0 ,: ],  a[1, 1 ,:], a[1, 2 ,: ]]]))
  

Результат:

 [[[ 1  2]
 [ 9 10]
 [11 12]]]
  

Ответ №3:

Вы можете применить две операции отдельно и объединить их впоследствии:

 np.array((a[0,0:1].tolist(), a[1,1:].tolist()))
# array([[[1, 2]], [[9, 10], [11, 12]]], dtype=object)