Более быстрый способ извлечь патчи из тензора? - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь извлечь патчи фиксированного размера с центром в определенной позиции (x, y, z).Код приведен ниже:

x = np.random.randint(0,99,(150, 80, 50, 3))
patch_size = 32
half = int(patch_size//2)
indices = np.array([[40, 20, 30], [60, 30, 27], [20, 18, 21]])
n_patches = indices.shape[0]
patches = np.empty((n_patches, patch_size, patch_size,patch_size, x.shape[-1]))
for ix,_ in enumerate(indices):
   patches[ix, ...] = x[indices[ix, 0]-half:indices[ix, 0]+half,
                        indices[ix, 1]-half:indices[ix, 1]+half,
                        indices[ix, 2]-half:indices[ix, 2]+half, ...]

Может кто-нибудь сказать мне, как заставить это работать быстрее?или любые другие альтернативы, если вы можете предположить, что это будет очень полезно.Я видел похожую проблему, решенную в https://stackoverflow.com/a/37901746/4296850,, но только для 2D-изображений.Может ли кто-нибудь помочь мне обобщить это решение?

1 Ответ

0 голосов
/ 23 октября 2018

Мы можем использовать np.lib.stride_tricks.as_strided на основе scikit-image's view_as_windows, чтобы получить раздвижные окна. Подробнее об использовании as_strided на основе view_as_windows.

from skimage.util.shape import view_as_windows

# Get sliding windows
w = view_as_windows(x,(2*half,2*half,2*half,1))[...,0]

# Get starting indices for indexing along the first three three axes
idx = indices-half

# Use advanced-indexing to index into first 3 axes with idx and a
# final permuting of axes to bring the output format as desired
out = np.moveaxis(w[idx[:,0],idx[:,1],idx[:,2]],1,-1)
...