基于二维NumPy数组第二列最大值筛选对应一维数组的问题
问题解决:按分组保留NumPy数组中第二列最大值的行
一、修复原代码的缺失问题
你的原代码存在两个核心问题:
- 循环仅处理到倒数第二个元素,最后一组(仅
59.03对应的行)未被添加到结果中; - 比较最大值时错误地将索引与数值对比(
arr[j][1] > biggest),逻辑存在隐患。
修改后的代码如下:
import numpy as np arr = np.array([[ 36.06, 209.14], [ 36.06, 214.55], [ 36.06, 215.91], [ 36.06, 225.29], [ 41.11, 186.76], [ 41.11, 191.79], [ 41.11, 197.21], [ 41.11, 197.33], [ 41.11, 201.19], [ 41.11, 206.15], [ 50.25, 165.51], [ 50.25, 174.32], [ 59.03, 148.79]]) biggest = 0 aux = [] for i in range(arr.shape[0]-1): j = i+1 if arr[i][0] == arr[j][0]: # 正确对比第二列数值,更新最大值对应的索引 if arr[j][1] > arr[biggest][1]: biggest = j else: aux.append(arr[biggest]) biggest = j # 切换到下一组的第一个元素 # 处理最后一组(循环未覆盖的最后一行) aux.append(arr[biggest]) print(np.array(aux))
运行后即可得到完整的预期输出。
二、更简便的NumPy内置方法实现
方法1:基于np.unique的直观实现
适合中等大小数组,逻辑清晰易读:
import numpy as np arr = np.array([[ 36.06, 209.14], [ 36.06, 214.55], [ 36.06, 215.91], [ 36.06, 225.29], [ 41.11, 186.76], [ 41.11, 191.79], [ 41.11, 197.21], [ 41.11, 197.33], [ 41.11, 201.19], [ 41.11, 206.15], [ 50.25, 165.51], [ 50.25, 174.32], [ 59.03, 148.79]]) # 获取第一列的所有唯一值 unique_groups = np.unique(arr[:, 0]) result = [] for group_val in unique_groups: # 筛选当前分组的所有行 group_rows = arr[arr[:, 0] == group_val] # 找到第二列最大值对应的行 max_row = group_rows[group_rows[:, 1].argmax()] result.append(max_row) # 转换为NumPy数组输出 result = np.array(result) print(result)
方法2:高效的排序+分组聚合实现
适合大型数组,避免逐组循环,效率更高:
import numpy as np arr = np.array([[ 36.06, 209.14], [ 36.06, 214.55], [ 36.06, 215.91], [ 36.06, 225.29], [ 41.11, 186.76], [ 41.11, 191.79], [ 41.11, 197.21], [ 41.11, 197.33], [ 41.11, 201.19], [ 41.11, 206.15], [ 50.25, 165.51], [ 50.25, 174.32], [ 59.03, 148.79]]) # 按第一列排序,确保同组元素连续 sorted_arr = arr[arr[:, 0].argsort()] # 获取分组的唯一值和起始索引 unique_vals, group_indices = np.unique(sorted_arr[:, 0], return_index=True) # 添加数组末尾索引作为最后一个分组的结束位置 group_indices = np.append(group_indices, sorted_arr.shape[0]) # 遍历每个分组,提取第二列最大值 max_second_col = [] for start, end in zip(group_indices[:-1], group_indices[1:]): max_val = sorted_arr[start:end, 1].max() max_second_col.append(max_val) # 组合唯一值和对应最大值得到结果 result = np.column_stack((unique_vals, max_second_col)) print(result)
内容的提问来源于stack exchange,提问作者Carlos Eduardo Corpus
相关产品推荐
相关产品推荐

