如何用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
相关产品推荐
相关产品推荐

