Python numpy.argpartition函数方法的使用

NumPy(Numerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍一下NumPy中argpartition方法的使用。

numpy.argpartition

numpy.argpartition(a, kth, axis=-1, kind='introselect', order=None)     [source]

使用kind关键字指定的算法,沿给定轴执行间接分区。 它沿着给定的轴按分区顺序返回与该索引数据具有相同形状的索引数组。

1.8.0版中的新功能。

参数 :

a :array_like

数组进行排序。

kth :int 或 int类型的sequence

分区依据的元素索引。 第k个元素将处于其最终排序位置,

所有较小的元素将在其之前移动,而所有较大的元素将在其后面移动。

 分区中所有元素的顺序是不确定的。 

如果提供第k个序列,它将立即将它们全部划分到其排序位置。

axisintNone, 可选

要排序的轴。 默认值为-1(最后一个轴)。

 如果为None,则使用展平的数组。

kind{‘introselect’}, 可选

选择算法。 默认值为“introselect”

或der :str 或 str的类型list, 可选

当a是定义了字段的数组时,此参数指定要比较的字段的第一个,

第二个等。单个字段可以指定为字符串,并且不需要指定所有字段,

但是仍将使用未指定的字段。 他们以dtype出现的顺序来打破关系。

返回值 :

index_array :ndarray, int

沿指定轴划分a的索引数组。 如果a是一维的,

a [index_array]会生成分区的a。 更一般而言,

np.take_along_axis(a,index_array,axis = a)

总是产生分区a,而与维数无关。

例子

一维数组:

>>> x = np.array([3, 4, 2, 1])
>>> x[np.argpartition(x, 3)]
array([2, 1, 3, 4])
>>> x[np.argpartition(x, (1, 3))]
array([1, 2, 3, 4])
>>> x = [3, 4, 2, 1]
>>> np.array(x)[np.argpartition(x, 3)]
array([2, 1, 3, 4])

多维数组:

>>> x = np.array([[3, 4, 2], [1, 3, 1]])
>>> index_array = np.argpartition(x, kth=1, axis=-1)
>>> np.take_along_axis(x, index_array, axis=-1)  # same as np.partition(x, kth=1)
array([[2, 3, 4],
       [1, 1, 3]])

列表排序:

>>> import numpy as np
>>> a = np.array([9, 4, 4, 3, 3, 9, 0, 4, 6, 0])
>>> print(np.argpartition(a, 4)) 
>>> [6 9 4 3 7 2 1 5 8 0]
>>> a[np.argpartition(a, 4)]     
>>> array([0, 0, 3, 3, 4, 4, 4, 9, 6, 9])

取列表中前5个元素 :

>>> import numpy as np
>>> a = np.array([9, 4, 4, 3, 3, 9, 0, 4, 6, 0])
>>> a[np.argpartition(a, -5)[-5:]]
>>> array([4, 4, 9, 6, 9])
推荐阅读
cjavapy编程之路首页