我想从(180x180x197)的布尔3D数组中提取3D多维数据集(3x3x3)。这类似于scipy.ndimage.measurements.label,但需要固定大小(3x3x3)。
是否有比使用for循环更快速的方法。

最佳答案

在您的特殊情况下,我建议使用ndimage.minimum_filter
假设您的数组称为``a''。下列:

centers = ndimage.minimum_filter(a, 3, mode="constant")


将仅包含那些数组中包含True框的那些
然后,您可以使用具有默认结构的scipy.ndimage.measurements.label进行分类,并可能确定已连接的盒子。要找到它们,您可以使用ndimage.measurements.find_objects

编辑:

通过上述方法,您将正确获取数组中所有多维数据集的中心。明确地说,我认为这是您最初的问题的答案。在评论中,事实证明,实际上仅需要非重叠的多维数据集。因此,需要分析minimum_filter的输出,在这里我可以想象很多方法。

每个群集只能使用以下内容获取一个多维数据集:

s = ndimage.generate_binary_structure(3,3)
labels, num = ndimage.measurements.label(centers, s)
locations = ndimage.measurements.find_objects(labels)
locations = map(lambda slices: [slices[i].start for i in xrange(3)], locations)


现在出现的问题是丢失了不重叠但共享一个面的多维数据集。实际上,可以想象到非常复杂的非重叠面共享立方体结构。当然,可以找到针对此问题的几种解决方案(不重叠的多维数据集)。因此,从发现的中心中选择一组多维数据集是一项全新的任务,我认为您必须找到一个最适合您的多维数据集。

一种方法是遍历所有解决方案并将每个找到的多维数据集设置为False:

get_starting_point = numpy.vectorize(lambda sl: sl.start) #to be applied on slices
s = ndimage.generate_binary_structure(3,3)
result = []

while True:
    labels, num = ndimage.measurements.label(centers, s)
    if not num:
        break
    locations = ndimage.measurements.find_objects(labels)
    sp = get_starting_point(locations)
    result.append(sp)
    for p in sp:
        centers[p[0]-1:p[0]+2, p[1]-1:p[1]+2, p[2]-1:p[2]+2] = False

numiter = len(results)
results = numpy.vstack(results)


我猜只需要很少的迭代。

我希望这就是你想要的

关于python - numpy从3d数组中提取3d多维数据集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39437806/

10-11 15:41