【Python】Python寻找多维数组(numpy.array)中最大值的位置(行和列)_numpy寻找最大值的位置

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

近需要从热力图中找出关键点的坐标也就是极大值的行和列。搜寻了网上的一些方法在这里总结一下。使用numpy进行多维数组中最大值的行和列搜寻非常的灵活有以下几种方法可供参考。

目录

二维数组

方法一np.max()函数 + np.where()函数

方法二np.argmax()函数 + np.unravel_index()函数

方法三 skimage.feature.peak_local_max函数

多维数组


二维数组

方法一np.max()函数 + np.where()函数

如下图所示x是一个 3×3 的二维np.array首先使用np.max(x)求出x中的最大值然后使用np.where函数找出数组x中最大值所在的位置。当然这只是np.where的其中一种用法np.where是一个非常方便的函数用法还有很多具体可自行阅读官方文档。

这里说明一下这种方法下np.where()返回的是一个元组元组包含两个元素这两个元素都是np数组它们的长度对应里面的值分别对应最大值坐标的行和列。比如在下图中第一次x的最大值只有一个所以返回元组中的两个数组长度都是1因此最大值的坐标为22第二次的x最大值有3个因此返回元组中的两个数组长度都是1坐标分别是011022

方法二np.argmax()函数 + np.unravel_index()函数

下图可以看出当二维数组中只有一个最大值的时候使用这种组合方法的结果是正确的当有多个最大值时返回的结果就有问题只返回了第一行最大值的结果。因此这种方法是有弊端的使用时需考虑实际情况。

原因分析

np.argmax()函数的正确写法是numpy.argmax(a, axis=None, out=None), aixs和out是可选参数np.argmax(x)表示aixs和out是默认这种情况会将x进行平铺之后只返回第一次出现的最大值的索引。因此np.argmax(x)=8np.argmax(y)=1。

np.unravel_index()函数的正确写法是numpy.unravel_index(indices, shape, order='C')官方给的解释这个函数的作用是“convert a flat index or array of flat indices into a tuple of coordinate arrays”就是找出shape尺寸数组展平后的第indices个数在原shape尺寸数组中的位置。

  • indices: An integer array whose elements are indices into the flattened version of an array of dimensions ``shape``. 表示一个索引这个索引是将维度为shape参数的矩阵展平后的索引。
  • shapeThe shape of the array to use for unraveling ``indices``. 用来解开 indices 的 数组形状。
  • order : {'C', 'F'}, optional. Determines whether the indices should be viewed as indexing in row-major (C-style) or column-major (Fortran-style) order. 可选一般默认就好。

  • 具体过程解释以下图情况下的 np.unravel_index(np.argmax(x), x.shape) 为例 也就是np.unravel_index(8, (3,3))也就是将 3 × 3 的数组展平后找到第8个数然后找出这个数在原来3 × 3 数组中的坐标。

方法三 skimage.feature.peak_local_max函数

peak_local_max函数的作用主要是来选出图像中的极大值坐标的很少用于筛选最大值。该函数的输入往往是一个h,w的数组h,w是图像的高和宽返回的是图像内部的极大值坐标数组n,2, n表示有多少个峰值极大值。当时输入的维度为三维3h, w)时返回的维度是n,3)。函数的官方定义为: "Find peaks in an image as coordinate list or boolean mask. Peaks are the local maxima in a region of `2 * min_distance + 1` (i.e. peaks are separated by at least `min_distance`). If both `threshold_abs` and `threshold_rel` are provided, the maximum of the two is chosen as the minimum intensity threshold of peaks." 参数为

peak_local_max(image, min_distance=1, threshold_abs=None, threshold_rel=None, exclude_border=True, indices=True, num_peaks=np.inf, footprint=None, labels=None, um_peaks_per_label=np.inf, p_norm=np.inf)

常用参数解释

  • min_distance: 分离出峰时的最小允许距离默认为1当要寻找图像中峰值的最大数量是请使用 min_distance = 1注意选取的峰值是在 “2 * min_distance + 1” 区域内的最大值。
  • threshold_abs选取峰值时的最小强度。当默认时threshold_abs的值为图像中的最小值。

  • threshold_rel同样时选取峰值时的最小强度。只不过计算方式为max(image) * threshold_rel。注意当threshold_abs、threshold_rel两个参数都传入时它们两者之间的最大者被选取为峰值的最小强度。

  • exclude_border 默认为True。用来去除图像边界处exclude_border距离内的峰值。当为True时以min_distance的值作为exclude_border的值。当为正整数时正常执行。当为 zero 或 False时所有的峰值都被接受即使是在边界处。

  • num_peaks选取前 num_peaks 个峰值的坐标。

多维数组

在画热力图时我们得到张量尺寸往往是bathsize, n, h, w,  bathsize是每一批量的数量n是一张图片对应的关键点的数量h,w分别是关键点对应的热力图的高和宽。我们主要是求最后两个维度上的最大值的坐标以获取关键点在热力图中的位置。因此最直观的方法就是对前面的维度做个循环然后使用上述的方法找最大值的坐标。当然也可以用peak_local_max函数来处理。

因有些其他事需处理没有去深入调研相关更高效的方法以后找到了再补充。大佬们有更合适的方法也欢迎在评论区交流

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python