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

np.argsort()处理含重复元素数组的索引顺序疑问

NumPy argsort()处理重复元素时索引顺序不保留原出现顺序的原因

当对包含重复值的NumPy数组调用np.argsort()函数时,会发现返回的索引数组中,重复元素的顺序和原数组里它们出现的先后顺序不一致。比如执行以下代码:

import numpy as np
np.argsort(np.array([5, 2, 3, 4, 5, 0, 3, 2, 5, 3, 2, 0, 5, 0, 5, 5, 0, 5, 0, 1, 3, 4, 3, 4, 3, 3, 2, 2, 3, 2, 3, 5, 0, 0, 0, 5, 2, 3, 0, 1, 0, 3, 2, 2, 2, 0, 5, 0, 0, 3, 3, 2, 2, 2, 0, 1, 5, 4, 4, 0, 3, 5, 2, 5, 5, 2, 1, 5, 1, 0, 2, 5, 0, 5, 2, 5, 3, 4, 5, 3, 0, 3, 2, 0, 2, 0]))

返回的索引数组为:

[85 33 32 40 45 47 48 54 18 34 16 59 13 38 72 11 83 69 80  5 39 55 19 68 66 52 51 65 70 74 44 43 84 82 53 62 42  7  1 10 29 36 27 26  9 76 60 79 20  6 22 37 50  2 30 41 81 28 25 24 49 58 23 77  3 57 21 78 75  4 73 61 8 67 12 64 63 14 15 56 17 46 31 35 71  0]

原数组中元素0首次出现的索引为5,之后依次是11、13等,但返回的索引数组起始为85、33等,而非按原数组中0出现的先后顺序排列,核心原因如下:

  • 默认排序算法不稳定:NumPy的argsort()默认采用快速排序(quicksort),这是一种典型的不稳定排序算法。不稳定排序在处理值相等的元素时,不会保证它们在原数组中的相对顺序被保留。排序过程中的交换操作会打乱重复元素原本的先后位置,最终返回的索引自然也就不遵循原出现顺序。

如果需要保留重复元素的原相对顺序,可以在argsort()中指定稳定排序的参数:

# 使用通用稳定排序
np.argsort(arr, kind='stable')
# 或者指定归并排序(属于稳定排序)
np.argsort(arr, kind='mergesort')

这样返回的索引数组里,值相等的元素就会严格按照它们在原数组中的出现先后顺序排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:45:23