You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于二维NumPy数组第二列最大值筛选对应一维数组的问题

问题解决:按分组保留NumPy数组中第二列最大值的行

一、修复原代码的缺失问题

你的原代码存在两个核心问题:

  1. 循环仅处理到倒数第二个元素,最后一组(仅59.03对应的行)未被添加到结果中;
  2. 比较最大值时错误地将索引与数值对比(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:09:19