Вы можете использовать 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