在大型3D Numpy数组中查找局部最大值。

10 浏览
0 Comments

在大型3D Numpy数组中查找局部最大值。

我正在处理一些以三维numpy数组形式存在的大体积图像数据。我用两个小的1D数组来解释我的任务。我有一个图像:\n

img = [5, 6, 70, 80, 3, 4, 80, 90]

\n和一个对该图像进行分割和标记的版本:\n

labels = [0, 0, 1, 1, 0, 0, 2, 2]

\nlabels中的每个数字代表img中的一个对象。两个数组具有相同的维度。因此,在这个例子中,img中有两个对象:\n[5, 6, 70, 80, 3, 4, 80, 90]\n我现在要做的是找到每个对象的最大值的位置,即在这种情况下是37。目前,我循环遍历所有标签,创建一个只包含与当前标签对应的对象的img版本,并寻找最大值:\n

for label in range(1, num_labels + 1):
    imgcp = np.copy(img)
    imgcp[labels != label] = 0
    max_pos = np.argmax(imgcp)
    max_coords = np.unravel_index(pos, imgcp.shape)

\n这种方法的一个问题是在每一步中复制img往往会导致内存错误。我觉得内存管理应该可以解决这个问题,但是否有一种更节省内存且可能更快的方法来完成这个任务呢?

0
0 Comments

在大型的3D Numpy数组中找到局部最大值是一个常见的问题。本文介绍了一种使用argpartition函数的方法来解决这个问题。

首先,给出了一个小的2D示例数组data和segments。接下来,通过np.where函数找到segments中非零元素的索引,并将其保存在变量nz中。然后,根据这些索引从segments和data数组中提取出非零元素,并分别保存在segc和dac中。

接下来,使用np.bincount函数统计segc中每个元素出现的次数,并将结果保存在cnts中。然后,使用np.cumsum函数计算cnts的累积和,并将结果保存在bnds中。

接下来,使用argpartition函数将segc数组按照bnds[1:-1]进行分区。argpartition函数返回的是分区后每个元素在原数组中的索引。将返回的索引保存在idx中。

然后,根据idx将dac数组重新排序,并保存在dai中。接着,使用np.maximum.reduceat函数和bnds[:-1]将dai数组按照bnds[:-1]进行分组,并找到每组中的最大值。将这些最大值保存在mx中。

接下来,使用np.where函数找到dai中等于mx.repeat(cnts[1:])的元素的索引,并将结果保存在am中。最后,将am中的索引映射回原始的坐标空间,并将结果保存在im中。

最后,输出结果包括坐标和最大值。其中,am表示坐标,data[am]表示最大值,segments[am]表示标签。

总结起来,这种方法通过使用argpartition函数和其他Numpy函数,能够高效地找到大型3D Numpy数组中的局部最大值。相比其他方法,该方法具有更快的速度和更高的效率。

0