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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:15:04