【问题标题】:Slicing array in regions - Python在区域中切片数组 - Python
【发布时间】:2014-10-28 13:19:37
【问题描述】:

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

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

其中的数字代表细胞参与的区域。这个掩码不是输入,它只是一个ndarray。这个面具只是代表我应该如何在每个5 x 5 邻域切割我的20 x 20

例如,第一个区域包含索引:

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

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

我知道如何使用“标准代码”来做到这一点,但我想知道是否有一种 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 的倍数。

谢谢。

【问题讨论】:

  • 如果没有关于程序输入和输出的更多信息,很难为您提供帮助。您能否提供一个示例:输入 + 掩码和预期输出?

标签: python arrays slice


【解决方案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)

【讨论】:

  • 很有趣,@jmetz。不知道那个!只是一个问题,是否可以在某些值应该位于不同区域的掩码中使用这种方法?比如我发的图片中,有的有1/2这个标签,表示这个位置应该返回到区域1和2。
  • @pceccon - 我会为这种情况使用附加标签,然后将附加标签中的值添加到目标区域。
  • 这意味着您将有多个“标签掩码”,例如,每个区域一个?
  • @pceccon - 效率低下;我的意思是,就像您的图像中有区域一样,例如“1/2”,这将被翻译成一个新标签,例如9. 然后,一旦提取了值,使用映射将 9 中的值附加到 1 和 2。这有意义吗?
  • 是的,确实如此。 (:谢谢。我会尝试更好地了解ndimage.label。阅读了文档,但还没有搞定。谢谢。
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2012-11-10
  • 2020-12-11
  • 2011-08-30
  • 2018-03-22
  • 2013-04-12
相关资源
最近更新 更多