最
近需要从热力图中找出关键点的坐标,也就是极大值的行和列。搜寻了网上的一些方法,在这里总结一下。使用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,因此最大值的坐标为(2,2),第二次的x最大值有3个,因此返回元组中的两个数组长度都是1,坐标分别是(0,1),(1,0),(2,2)
方法二: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)=8,np.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参数的矩阵展平后的索引。
-
shape:
The 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表示有多少个峰值(极大值)。当时输入的维度为三维(3,h, 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()函数来处理。
因有些其他事需处理,没有去深入调研相关更高效的方法,以后找到了再补充。大佬们有更合适的方法也欢迎在评论区交流!
最近需要从热力图中找出关键点的坐标,也就是极大值的行和列。搜寻了网上的一些方法,在这里总结一下。使用numpy进行多维数组中最大值的行和列搜寻非常的灵活,有以下几种方法可供参考。二维数组方法一:np.max()函数 + np.where()函数如下图所示,x是一个 3×3 的二维np.array,首先使用np.max(x)求出x中的最大值,然后使用np.where函数找出数组x中最大值所在的位置。当然这只是np.where的其中一种用法,np.where是一个非常方便的函数,用法还有很多,具体可
它提供了一个
多维
数组
对象和许多用于操作
数组
的函数。其
中
,
numpy
.max()函数可以用来计算
数组
中
的
最大值
。函数之外,
NumPy
还提供了许多其他用于计算
数组
最值、平均值、标准差等统计量的函数。例如,计算
数组
中
的最小值可以使用。除了计算一维
数组
中
的
最大值
之外,
numpy
.max()函数还可以用于计算
多维
数组
中
的
最大值
。总之,使用
NumPy
库可以方便地进行
数组
计算,特别是在科学计算领域
中
,它被广泛应用。使用
Python
的
NumPy
库计算
数组
中
的
最大值
。函数计算了它的
最大值
。
中
的
最大值
,并将结果赋给变量。
早就听说
Python
是一门很强大的语言,不过一直没有什么机会去学。直到前一段时间我的技术群里有人问我了一道
Python
的题目,本着帮助他人、充实自己的想法,我二话不说就去查找资料,做出了这道题。也算是入坑py了吧_(:з」∠)_
原题如下:
找出
矩阵
中
的
最大值
,输出
最大值
及其所在
行和列
。考虑同时存在多个
最大值
得情况。
使用input()函数输入,不需要任何提示信息。
输出时使用'{}’.format()格式,提示信息为“
最大值
:,所在行:,所在列:”
输入输出示例
输入:[[3,4,1],[6,7,8],[9,6,9]]
输出:
最大值
:9,所在行:2,所在列:0
np.sort()函数的作用,从小到大排序。(这里我也需要注意axis)
不写的话他的默认值为1.
使用x == np.max(x) 获得一个掩模
矩阵
,然后使用where方法即可返回
最大值
对应
位置
。
编程PCA算法的时候
x=np.
array
([[-1,-1,0,2,0],
[-2,0,0,1,1]])
yuan=x
x=0.2*np.dot(x,x.T)
e,v=np.linalg.eig(x)
print(v)
re=np.where(e==np.max(e))
v=v.T[r
peak_local_max函数返回图像
中
局部峰值(maxima)的坐标。
最大滤波器用于查找局部
最大值
。此操作将扩展原始图像,并合并相邻的局部
最大值
,使其小于扩展的大小。原始图像等于展开图像的
位置
将作为局部
最大值
返回。
peak_local_max (image, min_distance=1, threshold_abs=None, threshold_rel=None, exclude...
Channel-wise Topology Refinement Graph Convolution for Skeleton-Based Action Recognition[ICCV2021]
linaodan:
Channel-wise Topology Refinement Graph Convolution for Skeleton-Based Action Recognition[ICCV2021]
Graph Transformer系列论文阅读
programmer_ada:
MAE论文阅读《Masked Autoencoders Are Scalable Vision Learners》
programmer_ada: