首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python NumPy自定义排序算法实现

Python NumPy自定义排序算法实现

作者头像
sergiojune
发布2024-12-27 19:27:35
发布2024-12-27 19:27:35
4160
举报
文章被收录于专栏:日常学python日常学python

排序是数据处理和分析中的基本操作。虽然 NumPy 提供了高效的内置排序函数(如 numpy.sortnumpy.argsort),但有时需要实现自定义的排序逻辑,以满足特定需求,例如对数组中的特定列、组合条件或自定义顺序进行排序。

NumPy 内置排序方法

在开始自定义排序算法之前,先了解 NumPy 提供的内置排序功能:

  1. numpy.sort:对数组进行排序,默认沿最后一个轴进行排序。
  2. numpy.argsort:返回排序后的索引。
  3. numpy.lexsort:用于基于多个键的排序。

使用 NumPy 内置排序方法

代码语言:javascript
复制
import numpy as np

# 一维数组排序
arr = np.array([3, 1, 4, 1, 5, 9])
sorted_arr = np.sort(arr)
print("排序后的数组:", sorted_arr)

# 二维数组按列排序
arr2d = np.array([[3, 7], [1, 9], [4, 6]])
sorted_arr2d = np.sort(arr2d, axis=0)
print("二维数组按列排序:\n", sorted_arr2d)

输出:

代码语言:javascript
复制
排序后的数组: [1 1 3 4 5 9]
二维数组按列排序:
 [[1 6]
  [3 7]
  [4 9]]

这些方法对常见的排序任务非常高效,但当需要复杂逻辑时,可以基于 NumPy 实现自定义排序算法。

自定义排序算法实现

自定义排序算法可以通过以下几种方式实现:

方法一:基于索引的排序

可以通过 numpy.argsort 获取排序后的索引,然后根据这些索引重新排列数组。

代码语言:javascript
复制
# 自定义权重
weights = np.array([2, 3, 1, 5])

# 数组排序
arr = np.array([10, 20, 30, 40])

# 获取按权重排序的索引
sorted_indices = np.argsort(weights)

# 根据索引重排数组
sorted_arr = arr[sorted_indices]
print("按权重排序后的数组:", sorted_arr)

输出:

代码语言:javascript
复制
按权重排序后的数组: [30 10 20 40]

方法二:基于条件的排序

自定义排序逻辑可以通过 NumPy 的布尔索引和矢量化函数实现。

将数组中的偶数放在前面,奇数放在后面,同时保持每部分的升序。

代码语言:javascript
复制
# 自定义数组
arr = np.array([9, 4, 1, 6, 8, 3, 7])

# 偶数部分
evens = np.sort(arr[arr % 2 == 0])

# 奇数部分
odds = np.sort(arr[arr % 2 != 0])

# 合并结果
custom_sorted = np.concatenate((evens, odds))
print("按奇偶性排序后的数组:", custom_sorted)

输出:

代码语言:javascript
复制
按奇偶性排序后的数组: [4 6 8 1 3 7 9]

方法三:多键排序

多键排序类似于数据库中的多列排序,可以通过 numpy.lexsort 实现。

代码语言:javascript
复制
# 创建二维数组
arr = np.array([
    [10, 20],
    [5, 30],
    [10, 10],
    [5, 20]
])

# 按第1列和第0列排序
sorted_indices = np.lexsort((arr[:, 0], arr[:, 1]))
sorted_arr = arr[sorted_indices]
print("按多个键排序后的数组:\n", sorted_arr)

输出:

代码语言:javascript
复制
按多个键排序后的数组:
 [[10 10]
  [5 20]
  [10 20]
  [5 30]]

方法四:自定义排序函数

通过 NumPy 的 vectorizeargsort,可以定义更加复杂的排序逻辑。

代码语言:javascript
复制
# 定义数组
arr = np.array([-10, 5, -3, 8, -2])

# 获取按绝对值排序的索引
sorted_indices = np.argsort(np.abs(arr))

# 根据索引重排数组
sorted_arr = arr[sorted_indices]
print("按绝对值排序后的数组:", sorted_arr)

输出:

代码语言:javascript
复制
按绝对值排序后的数组: [-2 -3  5  8 -10]

自定义排序的实际应用

应用一:字符串数组排序

对于字符串数组,可以按长度或特定字符排序。

代码语言:javascript
复制
# 定义字符串数组
strings = np.array(["apple", "pear", "banana", "cherry"])

# 按字符串长度排序
sorted_indices = np.argsort([len(s) for s in strings])
sorted_strings = strings[sorted_indices]
print("按长度排序后的字符串数组:", sorted_strings)

输出:

代码语言:javascript
复制
按长度排序后的字符串数组: ['pear' 'apple' 'cherry' 'banana']

应用二:复杂数据结构排序

对于包含多个字段的结构化数组,可以基于指定字段进行排序。

代码语言:javascript
复制
# 定义结构化数组
data = np.array([
    (1, 'Alice', 25),
    (2, 'Bob', 30),
    (3, 'Charlie', 20)
], dtype=[('id', 'i4'), ('name', 'U10'), ('age', 'i4')])

# 按 age 字段排序
sorted_data = np.sort(data, order='age')
print("按年龄排序后的数据:", sorted_data)

输出:

代码语言:javascript
复制
按年龄排序后的数据:
 [(3, 'Charlie', 20) (1, 'Alice', 25) (2, 'Bob', 30)]

应用三:矩阵按行或列排序

代码语言:javascript
复制
# 创建矩阵
matrix = np.array([
    [5, 4, 3],
    [2, 8, 7],
    [1, 6, 9]
])

# 按每行的最大值排序
sorted_indices = np.argsort(matrix.max(axis=1))
sorted_matrix = matrix[sorted_indices]
print("按每行最大值排序后的矩阵:\n", sorted_matrix)

输出:

代码语言:javascript
复制
按每行最大值排序后的矩阵:
 [[5 4 3]
  [2 8 7]
  [1 6 9]]

实现自定义排序算法

实现冒泡排序

代码语言:javascript
复制
# 自定义冒泡排序
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

# 测试自定义排序
arr = np.array([64, 34, 25, 12, 22, 11, 90])
sorted_arr = bubble_sort(arr.copy())
print("冒泡排序结果:", sorted_arr)

输出:

代码语言:javascript
复制
冒泡排序结果: [11 12 22 25 34 64 90]

虽然 NumPy 已有高效的排序方法,但通过这种方式,可以实现特定的排序逻辑。

总结

本文详细介绍了 Python NumPy 中实现自定义排序算法的方法,包括基于索引、条件、多键排序以及自定义函数的排序。通过这些方法,可以灵活地满足不同场景下的排序需求。

此外,本文还结合实际案例展示了字符串排序、复杂数据结构排序以及矩阵排序的高级用法。掌握这些技巧,不仅能提高代码的灵活性和效率,还能解决更复杂的数据处理问题。在实际工作中,合理选择合适的排序方法,可以显著优化数据处理流程。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 日常学python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NumPy 内置排序方法
    • 使用 NumPy 内置排序方法
  • 自定义排序算法实现
    • 方法一:基于索引的排序
    • 方法二:基于条件的排序
    • 方法三:多键排序
    • 方法四:自定义排序函数
  • 自定义排序的实际应用
    • 应用一:字符串数组排序
    • 应用二:复杂数据结构排序
    • 应用三:矩阵按行或列排序
  • 实现自定义排序算法
    • 实现冒泡排序
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档