如何在Python中使用Numpy Argsort

437 阅读8分钟

本教程解释了如何使用Numpy argsort函数。 它解释了np.argsort的语法,还展示了清晰的例子。

如果你需要具体的帮助,你可以点击其中任何一个链接。 这些链接将把你带到教程的相应部分。

目录

说了这么多,Numpy argsort有点不直观,而且很难理解。 如果你阅读整个教程,你可能会获得更好的理解。

考虑到这一点,让我们开始吧。

对Numpy Argsort的快速介绍

让我们首先快速介绍一下argsort函数。

对于Numpy用户来说,argsort函数常常令人困惑。 我认为理解它的作用的最好方法是看一个清晰的例子。

Numpy argsort按照排序数组的顺序返回输入的索引。

An image that shows a simple visual example of how Numpy argsort works.

注意在这个直观的例子中,输出值是如何与输入值的索引相对应的。

  • 10是输入数组中最小的值,与索引1相对应。
  • 20是输入中的次大值,对应的索引是0。
  • 30是输入中的次大值,对应于索引4。
  • 40是输入中的次大值,对应于索引2。
  • 50是输入中最大的值,对应于索引3。

因此,输入是一个数字数组。

但输出将是一个新的数组,它包含了输入值的索引,按照这些值的顺序排序。

所以它的操作方式类似于Numpy的排序函数,但它不是返回排序后的数值,而是返回索引

为了帮助你理解,看看Python 中的一些工作实例可能会有帮助。 但首先,让我们快速看一下语法。

np.argsort 的语法

现在,让我们看一下 np.argsort 的语法。

一个简短的说明

在我们看语法之前,有一个简单的说明。

这里的语法解释和下面的例子都假定你已经用别名 "np"导入了Numpy。

你可以通过这段代码做到这一点。

import numpy as np

指出这一点很重要(以防你不熟悉),因为你导入Numpy的具体方式会影响确切的语法。

以这种方式导入Numpy是Python数据科学家的共同约定,我们将继续使用它。

np.argsort 语法

np.argsort 的语法很简单。

你以np.argsort() 的方式调用该函数。

An image that explains the syntax of np.argsort.

在括号内,你有几个参数,你可以用来控制函数的工作方式。

让我们来看看这些参数。

np.argsort的参数

np.argsort函数有几个参数。

  • a
  • axis
  • kind

还有一个第4个参数,叫做orderorder 这个参数很少使用。 它的理解也比较复杂,所以我在本教程中不涉及它。

让我们更详细地看一下上面的3个参数。

a (必填)

a 参数使你能够指定你要操作的输入阵列。

因此,如果你想对一个名为myarray 的数组进行操作,你可以将该函数调用为np.argsort(a = myarray)

请记住,这个参数是必须的,所以你需要为这个参数提供一个参数。

说了这么多,你不需要明确地使用参数名称本身。 相反,你可以按位置传入一个参数。 例如:np.argsort(myarray) 。 如果你没有明确使用a= 参数,那么argsort函数就会假定函数的第一个参数是要传递给a 参数的输入数组。

此外,argsort函数将接受我不同的数据结构作为输入。 通常,我们会使用一个Numpy数组作为输入。 但是 np.argsort 也会接受 Python 的列表和类似数组的对象。

axis (可选)

你可以使用axis 参数来控制沿哪个轴使用argsort。

记住,Numpy 数组有。 轴就像沿着Numpy数组指向的方向

A visual example of NumPy array axes.

因此,如果你使用axis = 0 ,argsort将向下操作(对于一个二维或更高维的数组)。

如果你使用axis = 1 ,argsort将在水平方向操作(同样,对于一个二维或更高维度的数组)。

axis 参数是可选的。 如果你没有明确使用它,它将默认为axis = -1 ,这是数组的最后一个轴(例如,对于一个二维数组,轴1)。

kind (可选)

kind 参数使你能够指定你想在排序操作中使用的排序算法。

要明确的是:在计算机科学中,有几种不同的算法,你可以用来对数据进行排序。

np.argsort ,这里有几种不同的选择,可以通过kind 参数来选择使用哪种排序算法。

  • quicksort
  • heapsort
  • mergesort

这些不同的排序技术有不同的优势和劣势。 例如,有些排序算法比其他算法更快;有些排序算法使用更多内存;等等。

尽管如此,大多数时候,对于大多数目的,默认的(quicksort)就可以了。

如何使用Numpy Argsort的例子

好的,现在,让我们看看几个例子。

例子

先运行这段代码

在你运行这些例子之前,你需要导入Numpy。

你可以用这段代码来做这件事。

import numpy as np

请记住,通过使用上述导入语法,我们将能够用前缀np (这是常见的惯例)来调用我们的Numpy函数。

例子1:在一个一维数组上使用argsort

让我们从一个简单的例子开始。

在这里,我们将在一个一维的Numpy数组上使用argsort。

首先,让我们用np.array函数创建一个数组

array_1d = np.array([ 20, 10, 40, 50, 30])

现在,让我们应用Numpy的argmax函数。

np.argsort(a = array_1d)

输出

array([1, 0, 4, 2, 3])

解释

看一下输出。 输出的值是[1, 0, 4, 2, 3]

这些值是如果数组被排序后的索引值。

在输入数组中,值10是最小的值。 输入数组中的值10位于索引位置1。 因为如果我们对数组进行排序,10将是第一个值,它的对应索引,1,是输出数组中的第一项。

值20是输入数组中第二个最小的值。 这个值在输入数组中的索引位置是0。 所以0是输出中的第二个值。

...以此类推。

所以输出只是提供输入值的索引位置,如果输入数组被排序的话。

实例2:将argsort应用于二维数组

接下来,让我们看看Numpy argsort如何在二维数组上操作。

首先,我们将创建一个二维数组,使用Numpy数组函数。

array_2d = np.array([[100, 7, 555], [22, 333, 9]])

注意,我们有一些大的值和一些小的值。 这些值没有以任何方式进行排序。

现在,我们将应用np.argsort。

np.argsort(array_2d)

输出

array([[1, 0, 2],
       [2, 0, 1]])

解释

这里发生了什么?

这个输出有排序后的行的索引。

但是为什么呢?

默认情况下,Numpy argsort是按照axis = -1 的方向对索引进行排序的。它默认是沿着最后一个轴进行操作。

这是一个二维数组,所以最后一个轴实际上是轴-1,它是指向水平方向的轴。

An image representing a 2D Numpy array, showing the arrows for axis-0 and axis-1

所以当我们在一个二维数组上使用Numpy argsort时,它是沿着行水平操作的。

因此,输出包含了排序后的行的索引值。

例子3:沿轴1使用argsort

现在让我们明确地使用轴参数。

在这里,我们将设置axis = 1

请记住,例子2中的代码实际上是在默认情况下对轴1进行操作的,所以输出结果也是一样的。 我们这次只是把它明确化。

在这个例子中,我们将重新使用我们在例子2中创建的数组,但是如果你没有运行那段代码,这里有创建数组的代码。

array_2d = np.array([[100, 7, 555], [22, 333, 9]])

所以现在我们有了我们的二维数组,让我们应用np.argsort与axis = 1

np.argsort(array_2d, axis = 1)

输出

array([[1, 0, 2],
       [2, 0, 1]])

解释

如果你已经读过例子2,这应该是有意义的,但让我把它分解一下。

在这里,我们明确地在轴1上操作。

记住,对于一个二维数组,轴-1是指水平方向的轴。

An image representing a 2D Numpy array, showing the arrows for axis-0 and axis-1

因此,使用np.argsort()axis = 1 ,使函数沿着行的方向进行水平操作。

输出是行的索引,如果输入的数组是沿着轴-1排序的话。

例子4:沿轴0使用argsort

让我们再做一个例子。

这里,我们将在0轴方向上使用Numpy argsort。

让我们首先创建我们的数组(这和前两个例子中的数组是一样的)。

array_2d = np.array([[100, 7, 555], [22, 333, 9]])

现在,让我们应用argsort。

np.argsort(array_2d, axis = 0)

输出

array([[1, 0, 1],
       [0, 1, 0]])

解释

这可能仍然令人困惑,所以让我解释一下。

当我们使用argsort和axis = 0 ,我们告诉argsort在0轴方向操作。

记住:对于一个二维数组,0轴是向下的。

An image representing a 2D Numpy array, showing the arrows for axis-0 and axis-1

因此,当我们使用np.argsort()axis = 0 时,我们是告诉函数在垂直方向上操作列。

因此,如果输入的数组沿0轴排序,输出的是逐列的索引。

在本教程中,我向你展示了如何使用Numpy argsort。

如果你需要对数组进行排序,Numpy argsort很有用,但如果你想真正擅长处理Numpy数组,你需要学习的Numpy函数还有很多。