numpy:使用矩阵对体积进行切片

时间:2018-11-28 13:20:37

标签: python numpy

我有一个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]

实际上有效(我会在意使用早期填充的边距处理)

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]

最好将fminprepost存储在一个数组fmins中, 因为某些NumPy / Scipy操作(例如argmingriddata)可能需要一个数组中的值。如果以后需要单独操作这三个组件,则始终可以使用fmins[i]或定义

来访问它们。
pre, fmin, post = fmins