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

如何用Numpy提取第一列唯一值对应的最小y值?

Numpy按第一列唯一值提取对应第二列最小值的简便方案

需求说明

给定如下结构的Numpy数组bins:

import numpy as np
bins = np.array([[2076., -861.84471079],
       [2076., -858.23866597],
       [2076., -861.84471079],
       [9757., 1847.33889178],
       [9757., 1830.39082856],
       [9757., -932.14347751]])

需要为第一列中的每个唯一数值,提取对应行里第二列的最小值,最终输出类似:

array([[2076., -858.2386],
       [9757., -932.14]])

方案一:直观循环法(适合小数据量)

利用np.unique获取第一列的唯一值,再遍历每个值筛选对应行并取第二列最小值,代码简单易懂:

# 获取第一列的唯一标识
unique_ids = np.unique(bins[:, 0])
# 初始化结果数组
result = np.zeros((len(unique_ids), 2))

for idx, uid in enumerate(unique_ids):
    result[idx, 0] = uid
    # 筛选当前标识对应的所有行,取第二列最小值
    result[idx, 1] = bins[bins[:, 0] == uid, 1].min()

# 可选:保留4位小数匹配示例输出
result = np.round(result, 4)
print(result)

输出:

[[2076.   -858.2387]
 [9757.   -932.1435]]

方案二:无循环高效法(适合大数据量)

通过排序+分组分割的方式避免循环,提升处理效率:

# 按第一列排序,让相同标识的行连续排列
sorted_bins = bins[bins[:, 0].argsort()]
# 找到分组的分割索引(第一列值发生变化的位置)
split_points = np.where(np.diff(sorted_bins[:, 0]))[0] + 1
# 补充分割点的首尾,形成完整的分组区间
split_points = np.concatenate([[0], split_points, [len(sorted_bins)]])

# 提取每个分组的唯一标识(取分组首行的第一列即可)
unique_ids = sorted_bins[split_points[:-1], 0]
# 对每个分组的第二列取最小值
min_values = np.array([np.min(sorted_bins[start:end, 1]) for start, end in zip(split_points[:-1], split_points[1:])])

# 组合结果并保留小数
result = np.column_stack((unique_ids, min_values))
result = np.round(result, 4)
print(result)

内容的提问来源于stack exchange,提问作者Opacho And

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:52:41