如何获取numpy二维数组中第二小值的索引?
获取Numpy数组第二小值的索引
嘿,我来帮你搞定这个问题!你已经用argmin找到了数组的最小值索引,但因为你的数组对角线都是最小值0.0,现在需要定位第二小值(也就是0.5)的位置,这里有几种可靠的解决方案:
方法一:屏蔽最小值后找新的最小值索引
这个思路很直观:先把原数组里所有等于最小值的位置替换成一个极大值(比如无穷大),这样剩下的数组里的最小值就是原数组的第二小值,再用argmin就能拿到对应的索引。
import numpy as np # 你的原始数组 a = np.array([[ 0. , 0.71, 5.66, 3.61, 4.24, 3.2 ], [ 0.71, 0. , 4.95, 2.92, 3.54, 2.5 ], [ 5.66, 4.95, 0. , 2.94, 1.41, 2.5 ], [ 3.61, 2.92, 2.94, 0. , 1. , 0.5 ], [ 4.24, 3.54, 1.41, 1. , 0. , 1.12], [ 3.2 , 2.5 , 2.5 , 0.5 , 1.12, 0. ]]) # 1. 获取数组的最小值 min_val = a.min() # 2. 创建掩码,把等于最小值的位置替换为无穷大,保留其他值 a_masked = np.where(a != min_val, a, np.inf) # 3. 获取第二小值的索引 row, col = np.unravel_index(a_masked.argmin(), a.shape) print(f"第二小值的索引:({row}, {col})") # 输出:(3, 5)
方法二:获取所有第二小值的索引
如果你的第二小值存在多个匹配位置(比如这里的(3,5)和(5,3)),可以用下面的方法一次性拿到所有符合条件的索引:
# 先拿到第二小值的具体数值 second_min_val = a_masked.min() # 找到所有等于第二小值的位置 all_indices = np.argwhere(a == second_min_val) print("所有第二小值的索引:") print(all_indices) # 输出: # [[3 5] # [5 3]]
小提示:为什么不直接排序?
你可能会想到把数组展开后排序取第二个元素的索引,但原数组里有6个最小值0.0,直接排序后的前几个元素都是0,无法直接定位到第二小值。所以必须先排除所有最小值,上面的方法就完美解决了这个问题。
内容的提问来源于stack exchange,提问作者ronak07
相关产品推荐
相关产品推荐

