我有一个3D numpy体积和一个2D numpy矩阵:
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)]
在不创建np.grid
的情况下,是否还有更多的pythonic(nupyic)方法来执行此操作?像这样:
foo[:,:,amin-1:amin+1]
实际上有效(我会在意使用早期填充的边距处理)
答案 0 :(得分:2)
您可以使用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
)可能需要一个数组中的值。如果以后需要单独操作这三个组件,则始终可以使用fmins[i]
或定义
pre, fmin, post = fmins