在大型3D Numpy数组中查找局部最大值。
在大型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我现在要做的是找到每个对象的最大值的位置,即在这种情况下是3
和7
。目前,我循环遍历所有标签,创建一个只包含与当前标签对应的对象的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
往往会导致内存错误。我觉得内存管理应该可以解决这个问题,但是否有一种更节省内存且可能更快的方法来完成这个任务呢?
在大型的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数组中的局部最大值。相比其他方法,该方法具有更快的速度和更高的效率。