我必须使用掩码输入在区域中“划分”n x m
数组。
例如,假设我有一个20 x 20
数组。我的面具如下(5 x 5
) - 总是:
其中数字代表细胞参与的区域。此掩码不是输入,只是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
的倍数。
谢谢。
答案 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)