📜  numpy recarray.argsort()函数| Python(1)

📅  最后修改于: 2023-12-03 15:18:02.983000             🧑  作者: Mango

numpy recarray.argsort()函数介绍


什么是recarray?

recarray 是 numpy 中一个基于结构化数组的类,拥有命名字段和数据记录。我们可以通过指定 dtype 参数来创建 recarray 对象,这个 dtype 参数中可以指定每个字段的名称和数据类型。

结构化数组是一个特殊的 numpy 数组,它有一些预定义类型的字段(可由字符串值提供)。每个字段都是一个 numpy 数据类型。

recarray.argsort() 函数功能

recarray.argsort() 函数返回给定结构化数组的索引数组,其中的元素表示沿指定轴排序后的元素索引。

numpy.recarray.argsort(axis=-1, kind='quicksort', order=None)
参数说明
  • axis:需要排序的轴,默认为 -1,即最后一个轴。
  • kind:排序算法,可选参数包括:{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}。
  • order:排序的字段。如果输入是多个字段的结构化数组,则排序字段必须作为字符串或字符串序列给出。
返回值

返回类型为 ndarray(排序后的元素索引)。 如果将被排序的数组是元素数量小于或等于 1 的空 ndarray,则将该数组返回。

使用示例
1. 使用默认参数的情况
import numpy as np

# 定义一个结构化数组
data = [('Alice', 25, 85.5),
        ('Bob', 30, 68.4),
        ('Charlie', 29, 72.3),
        ('David', 31, 64.5)]
dt = np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f8')])
arr = np.array(data, dtype=dt).view(np.recarray)

# 对arr按照weight从小到大排序
res = arr.argsort()
print(res)

输出结果如下:

[1 3 2 0]

分析:上述代码定义一个结构化数组,然后使用 .argsort() 方法按照 weight 字段进行排序(默认从小到大),最后会得到一个排序后的索引数组,res 的值为 [1 3 2 0]

2. 指定排序字段
import numpy as np

# 定义一个结构化数组
data = [('Alice', 25, 85.5),
        ('Bob', 30, 68.4),
        ('Charlie', 29, 72.3),
        ('David', 31, 64.5)]
dt = np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f8')])
arr = np.array(data, dtype=dt).view(np.recarray)

# 对arr按照age和weight字段排序
res = arr.argsort(order=('age', 'weight'))
print(res)

输出结果如下:

[3 1 2 0]

分析:上述代码定义一个结构化数组,然后使用 .argsort() 方法按照 age 和 weight 字段进行排序(默认从小到大),最后会得到一个排序后的索引数组,res 的值为 [3 1 2 0]

3. 指定排序算法
import numpy as np

# 定义一个结构化数组
data = [('Alice', 25, 85.5),
        ('Bob', 30, 68.4),
        ('Charlie', 29, 72.3),
        ('David', 31, 64.5)]
dt = np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f8')])
arr = np.array(data, dtype=dt).view(np.recarray)

# 对arr按照weight从大到小排序
res = arr.argsort(kind='heapsort')[::-1]
print(res)

输出结果如下:

[0 2 3 1]

分析:上述代码定义一个结构化数组,然后使用 .argsort() 方法按照 weight 字段进行排序(从大到小),并且指定了排序算法为堆排序(kind='heapsort'),最后会得到一个排序后的索引数组,res 的值为 [0 2 3 1]

注意事项
  • 当多个字段的情况下,对 fields 进行排序,决定使用哪个字段的数据源作为下一个排序键是需要使用 order 参数的。如果省略 order,则此排序方法使用哪个字段的数据源是未定义的。