在区域中切片数组 - Python

时间:2014-10-28 13:19:38

标签: python arrays slice

我必须使用掩码输入在区域中“划分”n x m数组。

例如,假设我有一个20 x 20数组。我的面具如下(5 x 5) - 总是:

enter image description here

其中数字代表细胞参与的区域。此掩码不是输入,只是ndarray。这个掩码只代表我应该在每个20 x 20邻居处切片5 x 5

例如,第一个区域包含指数:

  

(0,0),(1,0),(1,1),(2,0),(2,1),(2,2)

对于5 x 5数组的每个20 x 20邻域,我应该返回每个8区域中的值。

我知道如何使用“标准代码”来做到这一点,但我想知道是否有 Pythonic 这样做的方法,可以使用简洁的代码。

作为代码示例,我可以执行以下操作:

def slice_in_regions(data, x_dim, y_dim):
    for x in xrange(0, x_dim, 5):
        for y in xrange(0, y_dim, 5):
            neighbors = data[x:x+4, y:y+4]
            region1 = [neighbors[0,0], neighbors[1,0], neighbors[1,1], neighbors[2,0], neighbors[2,1], neighbors[2,2]]
            # region2, region3...

但是,这似乎不是一个好方法。此外,我指望我的数据维度是5的倍数。

谢谢。

1 个答案:

答案 0 :(得分:1)

看起来你可能只是调整你的面具大小,例如如果您已经使用numpy

mask = mask.repeat(4, axis=0).repeat(4, axis=1)
# Then you apply the mask using 
values = data[mask]

否则,

import numpy as np
mask = np.repeat(mask, 4, axis=0).repeat(4, axis=1)
# Then you apply the mask using 
values = np.array(data)[mask]

个别地区

如果您需要单独访问每个区域,您可以 使用带标签的掩码在前一个之前;因为标签将是 然后可以使用,例如,

values = [ data[mask==l] for l in range(1, mask.max()+1)]

此处的值将是一个数组列表,其中每个项目对应mask中的标记区域。

生成带标签的面具

为了完整起见,要从二进制掩码到标记掩码,其中每个像素都有自己的标签,您可以使用scipy.ndimage.label

mask = ndimage.label(mask, [[0,0,0],[0,1,0],[0,0,0]])

或者如果使用区域标注功能过度,您可以使用

获得类似的结果
mask[mask] = range(1,mask.sum()+1)