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

