Как получить подмассив в NumPy
У меня есть 3D-массив, и я хочу получить вложенный массив размером (2n+1) с центром индекса indx. Используя ломтики я могу использовать
y[slice(indx[0]-n,indx[0]+n+1),slice(indx[1]-n,indx[1]+n+1),slice(indx[2]-n,indx[2]+n+1)]
что будет только хуже, если я хочу различный размер для каждого измерения. Есть ли лучший способ сделать это.
2 ответа
Вам не нужно использовать slice
конструктор, если вы не хотите сохранить объект слайса для последующего использования. Вместо этого вы можете просто сделать:
y[indx[0]-n:indx[0]+n+1, indx[1]-n:indx[1]+n+1, indx[2]-n:indx[2]+n+1]
Если вы хотите сделать это без указания каждого индекса отдельно, вы можете использовать списки:
y[[slice(i-n, i+n+1) for i in indx]]
Вы можете создать массивы для индексации в разных измерениях 3D array
а затем использовать использование ix_
функция, чтобы создать карту индексации и, таким образом, получить нарезанный результат. Выгода с ix_
в том, что он позволяет транслировать карты индексации. Более подробную информацию об этом можно найти здесь. Затем вы можете указать разные размеры окна для каждого измерения для общего решения. Вот реализация с примерами входных данных -
import numpy as np
A = np.random.randint(0,9,(17,18,16)) # Input array
indx = np.array([5,10,8]) # Pivot indices for each dim
N = [4,3,2] # Window sizes
# Arrays of start & stop indices
start = indx - N
stop = indx + N + 1
# Create indexing arrays for each dimension
xc = np.arange(start[0],stop[0])
yc = np.arange(start[1],stop[1])
zc = np.arange(start[2],stop[2])
# Create mesh from multiple arrays for use as indexing map
# and thus get desired sliced output
Aout = A[np.ix_(xc,yc,zc)]
Таким образом, для заданных данных с массивом размеров окон, N = [4,3,2]
, whos
информация показывает -
In [318]: whos
Variable Type Data/Info
-------------------------------
A ndarray 17x18x16: 4896 elems, type `int32`, 19584 bytes
Aout ndarray 9x7x5: 315 elems, type `int32`, 1260 bytes
whos
информация для вывода, Aout
кажется согласованным с предполагаемой выходной формой, которая должна быть 2N+1
,