Есть несколько сообщений о нарезке 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
.
@ Джо, я не уверен, понял ли я твой вопрос. D1
и D2
должны быть двумя углами обрезанного ndarray.
Вы можете динамически собрать список или массив и использовать его для нарезки.
@ Джо, можешь ли ты дать мне пример?
Google для "расширенного индексирования numpy" добавит пример позже, если потребуется.
@Joe Спасибо. Я видел эту страницу, но прочту ее еще раз. Будем признательны за пример в любое время.
Это работает? A[tuple(slice(D1[i], D2[i]) for i in range(D1.shape[0]))]
@ Аарон классный. похоже, это работает отлично. Вы любите писать об этом в посте ниже?
Часть numpy индексирующая страница, на которую ссылается @Joe, вероятно, следующая:
Note
Remember that a slicing tuple can always be constructed as obj and used in thex[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
объекты.
Какие критерии определяют, в каком регионе обрезать?