使用scipy.ndimage.map_coordinates有效地对ndarray中的所有数组进行采样

时间:2013-12-02 21:52:47

标签: python numpy scipy multidimensional-array

我有一叠3D掩码阵列。我想在相同的固定位置对堆栈中的所有数组进行采样。

stack.ma_stack.shape

(1461,390,327)

#Indices to be sampled
x = np.array([ 117.38670304,  119.1220485 ])
y = np.array([ 209.98120554,  210.37202372])

以下内容非常有效,但仅适用于整数索引:

x_int = np.rint(x).astype(int)
y_int = np.rint(y).astype(int)
samp = stack.ma_stack[:,y_int,x_int]
samp.shape

(1461,2)

我正在尝试为浮点索引实现scipy.ndimage.map_coordinates插值采样,但我似乎无法弄清楚如何正确格式化坐标。

大多数示例使用map_coordinates对单个数组进行采样,以下内容适用于堆栈中的单个数组:

map_coord = np.array([[y,], [x,]])
samp = scipy.ndimage.map_coordinates(stack.ma_stack[0], map_coord, order=1)
samp.shape

(1,2)

我可以遍历堆栈中的每个数组,但我知道有一个简单的索引技巧可以在一次调用中对整个堆栈进行采样。我读了关于mgrid,并做了一些实验,但找不到合适的解决方案(我还在学习高级索引)。我知道有人会马上知道答案。感谢。

在相关的说明中:任何人都知道如何为掩码数组执行此操作而不用fill_value或np.nan替换缺少的数据? ndimage插值与掩码数组不能很好地匹配:

https://github.com/scipy/scipy/issues/1682

1 个答案:

答案 0 :(得分:1)

必须有办法让它自动播放......与此同时,您可以强制使用np.arange(...)进行广播,从堆叠中的每个2d数组中获取一个点:

map_coords = np.broadcast_arrays(np.arange(stack.ma_stack.shape[0])[:, None], y, x)
samp = ndimage.map_coordinates(stack.ma_stack, map_coords, order=1)

这样效率很低,因为“广播”是提前完成的(并且可能会复制所有数据),但它仍然比循环快一点:

In [88]: a = np.random.rand(1461, 390, 327)

In [89]: x = np.array([ 117.38670304,  119.1220485 ])

In [90]: y = np.array([ 209.98120554,  210.37202372])

In [107]: %%timeit
   .....: map_coord = np.array([[y,], [x,]])
   .....: np.concatenate([ndimage.map_coordinates(ai, map_coord, order=1) for ai in a])
   .....: 
10 loops, best of 3: 33.1 ms per loop

In [108]: %%timeit
   .....: map_coords = np.broadcast_arrays(np.arange(a.shape[0])[:, None], y, x)
   .....: ndimage.map_coordinates(a, map_coords, order=1)
   .....: 
100 loops, best of 3: 4.67 ms per loop

In [109]: samp_OP = np.concatenate([ndimage.map_coordinates(ai, map_coord, order=1) for ai in a])

In [110]: samp_chan = ndimage.map_coordinates(a, map_coords, order=1)

In [111]: np.allclose(samp_chan, samp_OP)
Out[111]: True
相关问题