Обрезка массива numpy произвольного размера с учетом двух углов

Есть несколько сообщений о нарезке 2D и 3D массивов NumPy, но в моей программе размерность массива неизвестна. Рассмотрим NumPy ndarray A произвольной размерности n (положительное целое число) и сформируем D=[d1,...,dn] (неотрицательные целые числа di), например:

import numpy as np

D=np.array([2,3,4,5])

A=np.random.rand(*D)

Теперь мне нужно извлечь блок A, начиная с D1=[d11,...,d1n] и заканчивая D2=[d21,...,d2n], где для всех 0<i<=n : 0<=d1i<=d2i<=di. Что-то типа:

A[D1:D2]

Если бы я новый n, я мог бы просто использовать A[d11:d21,...,d1i:d2i,...,d1n:d2n], но это не ко мне. Буду признателен, если вы поможете мне узнать, какой способ обрезки A наиболее эффективен с учетом D1 и D2.

Какие критерии определяют, в каком регионе обрезать?

Joe 10.08.2018 16:24

@ Джо, я не уверен, понял ли я твой вопрос. D1 и D2 должны быть двумя углами обрезанного ndarray.

Foad 10.08.2018 16:25

Вы можете динамически собрать список или массив и использовать его для нарезки.

Joe 10.08.2018 16:26

@ Джо, можешь ли ты дать мне пример?

Foad 10.08.2018 16:27

Google для "расширенного индексирования numpy" добавит пример позже, если потребуется.

Joe 10.08.2018 16:27

@Joe Спасибо. Я видел эту страницу, но прочту ее еще раз. Будем признательны за пример в любое время.

Foad 10.08.2018 16:29

Это работает? A[tuple(slice(D1[i], D2[i]) for i in range(D1.shape[0]))]

Aaron 10.08.2018 16:37

@ Аарон классный. похоже, это работает отлично. Вы любите писать об этом в посте ниже?

Foad 10.08.2018 16:43
0
8
547
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Часть numpy индексирующая страница, на которую ссылается @Joe, вероятно, следующая:

Note
Remember that a slicing tuple can always be constructed as obj and used in the x[obj] notation. Slice objects can be used in the construction in place of the [start:stop:step] notation. For example, x[1:10:5,::-1] can also be implemented as:

obj = (slice(1,10,5), slice(None,None,-1))
x[obj]

This can be useful for constructing generic code that works on arrays of arbitrary dimension.

Используя эту концепцию, вы сможете заранее создать кортеж из срезов, а затем применить его к A.

obj = tuple(slice(D1[i], D2[i]) for i in range(D1.shape[0]))
A[obj]

Примечание * на самом деле здесь не используется расширенная индексация, так как вы по-прежнему предоставляете кортеж объектов срезов, который является просто полным / функциональным эквивалентом использования срезов, разделенных двоеточиями и запятыми: в расширенном индексировании A[d11:d21, ... используются массивы разных типов данных, а не исключительно кортежи slice объекты.

Другие вопросы по теме