如何高效获取Numpy数组中x唯一值对应的y最大值?
高效处理超大数组:去重x并保留对应y的最大值
针对超大数组的高效处理需求,推荐使用NumPy的向量操作实现,全程避免Python循环,性能拉满。以下是具体实现步骤:
实现代码
import numpy as np # 示例输入数组(实际使用时直接替换为你的超大数组) x = np.array([0, 16, 24, 28, 30, 31, 32, 32, 33, 33, 33, 33]) y = np.array([1050, 110, 104, 107, 820, 101, 102, 649, 103, 101, 1020, 100]) # 1. 对x排序,同时同步y的顺序(确保相同x值聚在一起) sorted_indices = np.argsort(x) sorted_x = x[sorted_indices] sorted_y = y[sorted_indices] # 2. 找到x值发生变化的位置,作为分组边界 split_positions = np.where(sorted_x[1:] != sorted_x[:-1])[0] + 1 split_positions = np.insert(split_positions, 0, 0) # 3. 按分组计算每组y的最大值 max_y = np.maximum.reduceat(sorted_y, split_positions) unique_x = sorted_x[split_positions] # 输出结果 print("去重后的x数组:", unique_x) print("对应y的最大值数组:", max_y)
为什么高效?
- 全程使用NumPy内置的C级向量操作,没有Python层面的循环,处理超大数组时性能远高于纯Python实现
- 核心排序操作
np.argsort是高度优化的算法,时间复杂度为O(n log n),是此类分组问题的最优复杂度之一 - 如果你的x数组本身已经是有序的,可以跳过排序步骤,直接计算分组边界,时间复杂度降到O(n)
结果验证
运行上述代码后,输出完全符合预期:
去重后的x数组: [ 0 16 24 28 30 31 32 33] 对应y的最大值数组: [1050 110 104 107 820 101 649 1020]
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

