Как получить подмассив в 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,

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