- NumPy 教程
- NumPy - 首页
- NumPy - 简介
- NumPy - 环境
- NumPy 数组
- NumPy - Ndarray 对象
- NumPy - 数据类型
- NumPy 数组的创建和操作
- NumPy - 数组创建例程
- NumPy - 数组操作
- NumPy - 从现有数据创建数组
- NumPy - 从数值范围创建数组
- NumPy - 遍历数组
- NumPy - 数组重塑
- NumPy - 数组连接
- NumPy - 数组堆叠
- NumPy - 数组分割
- NumPy - 数组扁平化
- NumPy - 数组转置
- NumPy 索引和切片
- NumPy - 索引和切片
- NumPy - 高级索引
- NumPy 数组属性和操作
- NumPy - 数组属性
- NumPy - 数组形状
- NumPy - 数组大小
- NumPy - 数组步长
- NumPy - 数组元素大小
- NumPy - 广播
- NumPy - 算术运算
- NumPy - 数组加法
- NumPy - 数组减法
- NumPy - 数组乘法
- NumPy - 数组除法
- NumPy 高级数组操作
- NumPy - 交换数组轴
- NumPy - 字节交换
- NumPy - 复制和视图
- NumPy - 元素级数组比较
- NumPy - 数组过滤
- NumPy - 数组连接
- NumPy - 排序、搜索和计数函数
- NumPy - 数组搜索
- NumPy - 数组并集
- NumPy - 查找唯一行
- NumPy - 创建日期时间数组
- NumPy - 二元运算符
- NumPy - 字符串函数
- NumPy - 数学函数
- NumPy - 统计函数
- NumPy - 矩阵库
- NumPy - 线性代数
- NumPy - Matplotlib
- NumPy - 使用 Matplotlib 绘制直方图
- NumPy - NumPy 的 I/O 操作
- NumPy 排序和高级操作
- NumPy - 数组排序
- NumPy - 沿轴排序
- NumPy - 使用花式索引排序
- NumPy - 结构化数组
- NumPy - 创建结构化数组
- NumPy - 操作结构化数组
- NumPy - 字段访问
- NumPy - 记录数组
- Numpy - 加载数组
- Numpy - 保存数组
- NumPy - 向数组追加值
- NumPy - 交换数组列
- NumPy - 向数组插入轴
- NumPy 处理缺失数据
- NumPy - 处理缺失数据
- NumPy - 识别缺失值
- NumPy - 删除缺失数据
- NumPy - 填充缺失数据
- NumPy 性能优化
- NumPy - 使用数组进行性能优化
- NumPy - 使用数组进行矢量化
- NumPy - 数组的内存布局
- Numpy 线性代数
- NumPy - 线性代数
- NumPy - 矩阵库
- NumPy - 矩阵加法
- NumPy - 矩阵减法
- NumPy - 矩阵乘法
- NumPy - 元素级矩阵运算
- NumPy - 点积
- NumPy - 矩阵求逆
- NumPy - 行列式计算
- NumPy - 特征值
- NumPy - 特征向量
- NumPy - 奇异值分解
- NumPy - 求解线性方程组
- NumPy - 矩阵范数
- NumPy 元素级矩阵运算
- NumPy - 求和
- NumPy - 求平均值
- NumPy - 求中位数
- NumPy - 求最小值
- NumPy - 求最大值
- NumPy 集合运算
- NumPy - 唯一元素
- NumPy - 交集
- NumPy - 并集
- NumPy - 差集
- NumPy 有用资源
- NumPy 编译器
- NumPy - 快速指南
- NumPy - 有用资源
- NumPy - 讨论
NumPy - 数组排序
NumPy 中的数组排序
在 NumPy 中,排序指的是按特定顺序(通常是升序或降序)排列数组元素的过程。
NumPy 提供了几个执行排序操作的函数,这些函数可以应用于一维和多维数组。它们如下所示:
- sort() 函数
- partition() 函数
- argsort() 函数
- lexsort() 函数
使用 np.sort() 函数
np.sort() 函数对数组的元素进行排序,并返回一个包含排序后元素的新数组。除非使用 "ndarray" 对象的 sort() 函数就地排序,否则原始数组保持不变。
排序可以沿着指定的轴进行,如果未指定轴,则函数默认为沿着最后一个轴排序。以下是语法:
numpy.sort(a, axis=-1, kind=None, order=None)
其中,
- a: 要排序的数组。
- axis: 要排序的轴。默认为 -1,表示沿着最后一个轴排序。
- kind: 要使用的排序算法。选项包括 'quicksort'、'mergesort'、'heapsort' 和 'stable'。
- order: 在对结构化数组排序时使用,用于定义要比较的字段。
示例
在下面的示例中,我们使用 np.sort() 函数按升序对给定数组进行排序:
import numpy as np arr = np.array([3, 1, 2, 5, 4]) sorted_arr = np.sort(arr) print("Original Array:", arr) print("Sorted Array:", sorted_arr)
获得以下输出:
Original Array: [3 1 2 5 4] Sorted Array: [1 2 3 4 5]
NumPy 中的就地排序
就地排序是一种直接在原始数组上执行排序操作的方式,修改其顺序(默认情况下为升序),而无需创建单独的排序副本。
在 NumPy 中,我们可以使用 ndarray 对象的 sort() 函数执行就地排序。以下是语法:
ndarray.sort(axis=-1, kind=None, order=None)
示例
在这个例子中,我们使用 arr.sort() 函数对给定数组进行就地排序,修改原始数组:
import numpy as np arr = np.array([3, 1, 2, 5, 4]) arr.sort() print("In-Place Sorted Array:", arr)
这将产生以下结果:
In-Place Sorted Array: [1 2 3 4 5]
沿特定轴排序
NumPy 允许在多维数组中沿特定轴排序元素。它可以帮助您以尊重数组结构的方式组织数据,无论这是否涉及排序行、列或更高维度的切片。
我们可以使用 np.sort() 函数的 axis 参数在 Numpy 中沿特定轴排序元素:
- 轴 0: 在二维数组中表示行(向下方向)。沿轴 0 排序会独立地对每一列进行排序。
- 轴 1: 在二维数组中表示列(水平方向)。沿轴 1 排序会独立地对每一行进行排序。
- 更高维度: 在超过两个维度的数组中,轴 2、3 等对应于更高维度的切片。
示例
在下面的示例中,我们沿两个不同的轴对二维 NumPy 数组进行排序:轴 0(列)和轴 1(行):
import numpy as np arr = np.array([[3, 2, 1], [6, 5, 4]]) sorted_arr_axis0 = np.sort(arr, axis=0) sorted_arr_axis1 = np.sort(arr, axis=1) print("Original Array:\n", arr) print("Sorted Along Axis 0:\n", sorted_arr_axis0) print("Sorted Along Axis 1:\n", sorted_arr_axis1)
以上代码的输出如下:
Original Array: [[3 2 1] [6 5 4]] Sorted Along Axis 0: [[3 2 1] [6 5 4]] Sorted Along Axis 1: [[1 2 3] [4 5 6]]
使用 partition() 函数进行部分排序
NumPy 中的 np.partition() 函数用于重新排序数组中的元素,使得所有小于指定元素(称为“第 k 个元素”)的元素都移动到它之前,所有大于“第 k 个元素”的元素都移动到它之后。
当您需要在不完全排序的情况下查找数组中第 k 个最小或最大元素时,此函数非常有用。以下是语法:
numpy.partition(a, kth, axis=-1, kind='introselect', order=None)
其中,
- a: 您要分区的数组。
- kth: 我们需要围绕其对数组进行分区的元素的索引。它可以是整数或整数序列。
- axis: 要对数组进行分区的轴。默认情况下,它设置为 -1,表示最后一个轴。
- kind: 要使用的选择算法。默认为 'introselect',它是快速选择和中位数的中位数的混合体。
- order: 用于复杂数据类型,用于指定要排序的字段。
示例
在此示例中,数组被分区,使得索引 2 处的元素被定位,所有在其之前的元素都小于或等于它,所有在其之后的元素都大于或等于它:
import numpy as np arr = np.array([3, 1, 2, 5, 4]) partitioned_arr = np.partition(arr, 2) print("Partitioned Array:", partitioned_arr)
获得的输出如下所示:
Partitioned Array: [1 2 3 5 4]
使用 argsort() 函数进行间接排序
NumPy 中的 np.argsort() 函数用于获取将对数组进行排序的索引。np.argsort() 函数不会返回排序后的数组本身,而是返回一个索引数组,表示应按什么顺序排列元素才能获得排序后的数组。
当您需要根据另一个数组的排序顺序对一个数组进行排序时,此函数非常有用。以下是语法:
numpy.argsort(a, axis=-1, kind=None, order=None)
其中,
- a: 您要排序的数组。
- axis: 要排序的轴。默认情况下,它设置为 -1,表示最后一个轴。
- kind: 要使用的排序算法。选项包括 'quicksort'、'mergesort'、'heapsort' 和 'stable'。默认为 'quicksort'。
- order: 用于复杂数据类型,用于指定要排序的字段。
示例
在下面的示例中,我们使用 np.argsort() 函数获取将对数组 "arr" 进行排序的索引。然后,我们使用这些索引将原始数组重新排列为其排序顺序:
import numpy as np arr = np.array([3, 1, 2, 5, 4]) sorted_indices = np.argsort(arr) print("Indices that would sort the array:", sorted_indices) print("Sorted Array Using Indices:", arr[sorted_indices])
执行以上代码后,我们得到以下输出:
Indices that would sort the array: [1 2 0 4 3] Sorted Array Using Indices: [1 2 3 4 5]
排序结构化数组
NumPy 中的结构化数组允许您创建数组,其中每个元素可以有多个字段,每个字段都有自己的数据类型。这类似于数据库表或传统编程语言中的记录,其中每个条目可以保存多种类型的数据。
您可以根据一个或多个字段对结构化数组进行排序。当您想根据特定条件对记录进行排序时,这很有用。为此,您可以使用 NumPy 中的 np.sort() 函数,该函数接受一个 order 参数来指定要排序的字段。
示例
在下面的示例中,我们根据 'age' 字段对结构化数组 "arr" 进行排序:
import numpy as np arr = np.array([('John', 25), ('Alice', 30), ('Bob', 22)], dtype=[('name', 'U10'), ('age', 'i4')]) sorted_arr = np.sort(arr, order='age') print("Sorted Structured Array:\n", sorted_arr)
产生的结果如下:
Sorted Structured Array: [('Bob', 22) ('John', 25) ('Alice', 30)]
使用 lexsort() 函数进行字典序排序
np.lexsort() 函数使用一系列键执行间接排序。它获取一系列字段或列,并返回一个索引数组,该数组将根据这些键对输入数组进行排序。
numpy.lexsort(keys, axis=-1)
其中,
- keys: 数组序列或单个数组,其中每个数组表示一个用于排序的键。键按提供的顺序排序,这意味着序列中的最后一个键是主键,倒数第二个键是次键,依此类推。
- axis: 要排序的轴。默认情况下,它设置为 -1,表示最后一个轴。
示例
在此示例中,np.lexsort() 函数用于首先根据名称对数组进行排序,如果名称相同,则按年龄排序。排序顺序基于字典序比较:
import numpy as np names = np.array(['John', 'Alice', 'Bob']) ages = np.array([25, 30, 22]) sorted_indices = np.lexsort((ages, names)) print("Indices for Lexicographical Sort:", sorted_indices) print("Sorted Names and Ages:", names[sorted_indices], ages[sorted_indices])
我们得到如下所示的输出:
Indices for Lexicographical Sort: [1 2 0] Sorted Names and Ages: ['Alice' 'Bob' 'John'] [30 22 25]