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

基于NumPy提取二维数组前两列唯一且第三列最小的行

使用NumPy高效处理二维数组的去重与保留最小值行

假设我们有一个每行含3个元素的二维NumPy数组,要实现提取前两列组合唯一的行,重复组合保留第三列最小的行,可以用以下两种高效的矢量化方法:

方法一:排序后取唯一行(推荐,性能最优)

利用np.lexsort先按前两列分组排序,再按第三列升序排序,最后通过np.unique提取每个分组的首行(即第三列最小的行):

import numpy as np

# 示例数组
arr = np.array([
    [1, 2, 5],
    [1, 2, 3],
    [2, 3, 7],
    [2, 3, 4],
    [3, 4, 6]
])

# 按「第一列→第二列→第三列升序」排序,确保同组内第三列最小的行排在最前
sorted_idx = np.lexsort((arr[:, 2], arr[:, 0], arr[:, 1]))
sorted_arr = arr[sorted_idx]

# 提取前两列唯一组合的首行索引,得到最终结果
unique_indices = np.unique(sorted_arr[:, :2], axis=0, return_index=True)[1]
result = sorted_arr[unique_indices]

print(result)
# 输出:
# [[1 2 3]
#  [2 3 4]
#  [3 4 6]]

方法二:分组取最小值索引

通过np.unique获取前两列的分组信息,再对每个分组筛选第三列最小的行:

import numpy as np

arr = np.array([
    [1, 2, 5],
    [1, 2, 3],
    [2, 3, 7],
    [2, 3, 4],
    [3, 4, 6]
])

# 获取前两列的唯一组合、分组逆序索引(标记每行属于哪个唯一组)
_, inv = np.unique(arr[:, :2], axis=0, return_inverse=True)

# 遍历每个分组,找到组内第三列最小的行索引
selected_indices = []
for group_id in np.unique(inv):
    group_rows = np.where(inv == group_id)[0]
    min_row_idx = group_rows[np.argmin(arr[group_rows, 2])]
    selected_indices.append(min_row_idx)

result = arr[selected_indices]

print(result)
# 输出同方法一

关键说明

  • 方法一依赖NumPy底层优化的排序和去重操作,处理大数组时性能远优于手动循环,是首选方案。
  • 两种方法均避免了繁琐的嵌套循环,完全利用NumPy的矢量化特性实现高效计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:02:15