Numpy: нарезка тома с использованием матрицы - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть трехмерный объемный объем и двумерная матрица:

foo = np.random.rand(20,20,10)
amin = np.argmin(foo, axis=2)

Я хотел бы использовать amin переменную для нарезки объема таким же образом, как np.min будет делать:

grid = np.indices(min.shape)
idcs = np.stack([grid[0], grid[1], min])

fmin = foo[idcs[0], idcs[1], idcs[2]]

проблема в том, что я не могу использовать np.min, потому что мне также нужны amin соседи для целей интерполяции, что-то, что я хотел бы получить, делая:

pre  = foo[idcs[0], idcs[1], np.clip(idcs[2]-1, 0, 9)]
post = foo[idcs[0], idcs[1], np.clip(idcs[2]+1, 0, 9)]

Есть ли ещепитонический (nupyic) способ сделать это без создания np.grid?что-то вроде:

foo[:,:,amin-1:amin+1]

, который на самом деле работает (я бы позаботился об обработке полей с ранним заполнением)

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете использовать np.ogrid вместо np.indices для экономии памяти.np.ogrid возвращает "открытую" сетку:

In [24]: np.ogrid[:5,:5]
Out[24]: 
[array([[0],
        [1],
        [2],
        [3],
        [4]]), array([[0, 1, 2, 3, 4]])]

ogrid возвращает массивы компонентов, которые можно использовать в качестве индексов так же, как при использовании np.indices.NumPy автоматически транслирует значения в открытой сетке, когда они используются как индексы:

In [49]: (np.indices((5,5)) == np.broadcast_arrays(*np.ogrid[:5, :5])).all()
Out[49]: True

import numpy as np
h, w, d = 20, 20, 10
foo = np.random.rand(h, w, d)
amin = np.argmin(foo, axis=2)
X, Y = np.ogrid[:h, :w]
amins = np.stack([np.clip(amin+i, 0, d-1) for i in [-1, 0, 1]])
fmins = foo[X, Y, amins]

Лучше хранить fmin, pre и post в одном массиве, fmins, поскольку для некоторых операций NumPy / Scipy (например, argmin или griddata) могут потребоваться значения в одном массиве.Если позже вам потребуется работать с этими 3 компонентами по отдельности, вы всегда можете получить к ним доступ, используя fmins[i] или определив

pre, fmin, post = fmins
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...