如何在Numpy中先判断近似相等浮点数,再找一维数组的最大值及索引?
问题描述
给定一维浮点数组,比如 [0.12345678, 0.23456788, 0.23456789],需要完成以下逻辑:
- 先识别数组中与最大值近似相等的所有元素
- 在这些近似相等的元素中,取数值最小的那个,同时返回它的最小索引
要求不使用for/while循环,基于Numpy实现。
示例1:
数组: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.9, 0.9, 0.9] 预期结果: [0.9, 7] 解释: 0.9是最大值,首次出现在索引7处
示例2:
数组: [0.11111111, 0.22222222, 0.33333333, 0.44444444, 0.44444445, 0.12345678] 预期结果: [0.44444444, 3] 解释: 0.44444445是最大值,但0.44444444与其近似相等,因此取较小值及对应索引3
解决方案
通过Numpy的np.max、np.isclose、np.min和np.argwhere等函数组合实现,步骤如下:
- 计算数组的最大值
max_val - 用
np.isclose生成布尔掩码,筛选出所有与max_val近似相等的元素 - 在掩码筛选后的子数组中,找到最小的数值
target_val - 定位数组中第一个等于
target_val的索引(确保取最小索引)
具体代码实现:
import numpy as np def find_target(arr): # 获取数组最大值 max_val = np.max(arr) # 筛选与最大值近似相等的元素 close_mask = np.isclose(arr, max_val) # 在近似相等的元素中找最小值 target_val = np.min(arr[close_mask]) # 找到第一个等于target_val的索引 target_idx = np.argwhere(arr == target_val)[0][0] return [target_val, target_idx]
验证示例
- 示例1测试:
arr1 = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.9, 0.9, 0.9]) print(find_target(arr1)) # 输出: [0.9, 7]
- 示例2测试:
arr2 = np.array([0.11111111, 0.22222222, 0.33333333, 0.44444444, 0.44444445, 0.12345678]) print(find_target(arr2)) # 输出: [0.44444444, 3]
注:np.isclose默认使用通用场景的合理误差阈值,若需自定义精度,可传入rtol(相对误差)和atol(绝对误差)参数,比如np.isclose(arr, max_val, rtol=1e-8, atol=1e-10)。
内容的提问来源于stack exchange,提问作者J.F.
相关产品推荐
相关产品推荐

