Numpy数组分区与排序代码运行逻辑及数值原理求解
Numpy 分区、排序操作执行逻辑详解
首先明确核心函数的基础规则:
np.partition(a, kth):分区排序函数,时间复杂度远低于全排序,仅保证返回数组中kth索引位置的元素等于全数组升序排序后kth位置的元素,kth左侧所有元素都≤该位置元素,右侧所有元素都≥该位置元素,左右两侧内部元素的顺序不做保证。np.argpartition(a, kth):逻辑和np.partition完全一致,区别是返回的不是元素数组,而是原数组的下标数组,下标对应的原元素符合上述分区规则。
首先给出原始数组的全排序结果作为对照:
原始数组:arr = [10, 11, 4, 3, 5, 7, 9, 2, 13]
全升序排序结果:[2, 3, 4, 5, 7, 9, 10, 11, 13]
数组长度为9,负索引-3对应正索引6,全排序后索引6的元素为10,这是后续所有操作的基准。
逐行代码拆解
1. np.partition(np.array(arr), -3)
返回结果:array([ 9, 5, 4, 3, 2, 7, 10, 11, 13])
完全符合np.partition的规则:
- 负索引
-3(正索引6)的元素为10,和全排序后该位置的元素一致 - 左侧6个元素全部≤10,右侧2个元素全部≥10,左侧内部顺序无强制规则
2. np.sort(np.partition(np.array(arr), -3)[-4:])
返回结果:array([ 7, 10, 11, 13])
执行过程:
- 第一步取分区结果的最后4个元素:
[7, 10, 11, 13] - 第二步对这4个元素做升序排序,得到最终结果
3. np.argpartition(np.array(arr), -3)
返回结果:array([6, 4, 2, 3, 7, 5, 0, 1, 8], dtype=int64)
逻辑和第一行的分区完全对应,返回的是原数组下标:
- 负索引
-3(正索引6)位置的下标为0,对应原数组arr[0] = 10,符合全排序后该位置的元素要求 - 左侧下标对应的原元素全部≤10,右侧下标对应的原元素全部≥10,顺序无强制规则
- 把返回的下标逐一对应原数组元素,结果和第一行的分区元素数组完全一致
4. np.sort(np.argpartition(np.array(arr), -3)[-4:])
返回结果:array([0, 1, 5, 8], dtype=int64)
执行过程:
- 第一步取argpartition结果的最后4个下标:
[5, 0, 1, 8] - 第二步对这4个下标本身做升序排序,得到最终结果,这四个下标对应原数组的元素分别为
7、10、11、13,和第二行返回的元素完全对应
内容的提问来源于stack exchange,提问作者Arghya Biswas
相关产品推荐
相关产品推荐

