#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)