【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.19 排序革命:argsort的十大高阶用法

在这里插入图片描述

1.19 排序革命:argsort的十大高阶用法

目录
排序革命:argsort的十大高阶用法
多列排序的稳定实现方案
按自定义规则排序的秘籍
分块排序外存算法实现
推荐系统Top-K检索优化

1.19.1 多列排序的稳定实现方案

在处理多列数据时,使用 NumPyargsort 进行排序是一个非常高效的方法。本节将详细介绍如何使用 lexsort 进行多列排序,并测试其稳定性。

高级排序
多键排序
自定义排序
大数据处理
推荐系统
lexsort
拼音排序
外存排序
相似度排序
1.19.1.1 多键排序的lexsort使用详解

lexsortNumPy 提供的一个函数,用于按多个键进行排序。lexsort 的排序顺序是从后向前,即最右边的键是主要排序键,最左边的键是次要排序键。

import numpy as np# 创建多列数据
data = np.array([[3, 7, 1],[1, 3, 2],[2, 5, 0],[1, 2, 3],[3, 1, 2]
])# 使用 lexsort 进行排序
sorted_indices = np.lexsort((data[:, 2], data[:, 1], data[:, 0]))  # 按第0列、第1列、第2列排序
sorted_data = data[sorted_indices]  # 按索引排序数据# 打印排序结果
print("原始数据: ")
print(data)
print("排序后的数据: ")
print(sorted_data)
78% 22% 排序方法性能对比(百万数据) lexsort 复合键argsort
1.19.1.2 排序稳定性测试方案

排序算法的稳定性是指在排序过程中,相等的元素的相对位置不会发生变化。NumPyargsortlexsort 都是稳定的排序算法。本节将通过一个测试方案来验证这一点。

import numpy as np# 创建一个包含重复元素的数组
data = np.array([3, 1, 2, 1, 2, 3])# 使用 argsort 进行排序
sorted_indices = np.argsort(data, kind='stable')  # 指定稳定排序算法
sorted_data = data[sorted_indices]# 打印排序结果
print("原始数据: ", data)
print("排序后的数据: ", sorted_data)
print("排序索引: ", sorted_indices)# 创建多列数据
multi_data = np.array([[3, 7, 1],[1, 3, 2],[2, 5, 0],[1, 2, 3],[3, 1, 2]
])# 使用 lexsort 进行排序
sorted_indices_lex = np.lexsort((multi_data[:, 2], multi_data[:, 1], multi_data[:, 0]))
sorted_multi_data = multi_data[sorted_indices_lex]# 打印排序结果
print("原始多列数据: ")
print(multi_data)
print("排序后的多列数据: ")
print(sorted_multi_data)
print("排序索引: ", sorted_indices_lex)

1.19.2 按自定义规则排序的秘籍

在某些场景下,我们可能需要根据自定义规则对数据进行排序。本节将介绍如何实现中文拼音排序和自定义排序函数。

1.19.2.1 中文拼音排序自定义函数

中文排序通常需要根据拼音序进行。我们可以使用 pypinyin 库来实现这一点。

import numpy as np
from pypinyin import pinyin, lazy_pinyin, Style# 创建一个包含中文字符串的数组
data = np.array(['张三', '李四', '王五', '赵六', '钱七'])# 定义拼音排序函数
def sort_by_pinyin(arr):"""根据拼音排序中文字符串:param arr: 输入的中文字符串数组:return: 排序后的数组"""# 将中文字符串转换为拼音pinyin_list = [lazy_pinyin(name) for name in arr]# 按拼音排序sorted_indices = np.argsort(pinyin_list, kind='stable')  # 指定稳定排序算法sorted_data = arr[sorted_indices]return sorted_data# 进行拼音排序
sorted_data = sort_by_pinyin(data)# 打印排序结果
print("原始数据: ", data)
print("拼音排序后的数据: ", sorted_data)
1.19.2.2 图解自定义排序函数
graph TBA[自定义排序函数]A --> B1[定义排序规则]A --> B2[转换排序键]A --> B3[使用 argsort 排序]B1 --> C1[例如:拼音排序]B2 --> C2[将中文名转换为拼音]B3 --> C3[按拼音排序索引]

1.19.3 分块排序外存算法实现

处理大规模数据时,内存限制往往是瓶颈。分块排序是一种有效的外存排序算法,本节将介绍如何在 10GB 数据上实现分块排序。

1.19.3.1 10GB数据的外部排序实现
import numpy as np
import os# 定义分块大小
chunk_size = 1000000# 生成 10GB 的数据
data = np.random.rand(100000000)  # 1亿条数据
data.tofile('data.npy')  # 保存为二进制文件# 分块读取并排序
def external_sort(file_path, chunk_size, output_file):"""外存排序:param file_path: 输入文件路径:param chunk_size: 分块大小:param output_file: 输出文件路径"""# 读取文件大小file_size = os.path.getsize(file_path)data_type_size = data.dtype.itemsizetotal_elements = file_size // data_type_size# 创建临时文件列表temp_files = []# 分块读取并排序for i in range(0, total_elements, chunk_size):chunk = np.fromfile(file_path, dtype=np.float64, count=chunk_size, offset=i * data_type_size)sorted_chunk = np.sort(chunk, kind='stable')  # 指定稳定排序算法temp_file = f'temp_{i // chunk_size}.npy'np.save(temp_file, sorted_chunk)temp_files.append(temp_file)# 合并排序后的分块with open(output_file, 'wb') as f_out:merge_sorted(temp_files, chunk_size, f_out)# 合并排序后的分块
def merge_sorted(temp_files, chunk_size, output_file):"""合并排序后的分块:param temp_files: 临时文件列表:param chunk_size: 分块大小:param output_file: 输出文件对象"""# 打开所有临时文件files = [np.load(temp_file) for temp_file in temp_files]# 初始化索引和分块读取indices = [0] * len(files)chunks = [file[:chunk_size] for file in files]while True:# 找到当前最小值的索引min_index = Nonemin_value = float('inf')for i, chunk in enumerate(chunks):if len(chunk) > 0 and chunk[0] < min_value:min_value = chunk[0]min_index = iif min_index is None:break# 将最小值写入输出文件output_file.write(chunks[min_index][0].tobytes())# 更新分块读取索引indices[min_index] += 1chunks[min_index] = files[min_index][indices[min_index]:indices[min_index] + chunk_size]# 关闭所有临时文件for file in files:file.close()# 删除临时文件for temp_file in temp_files:os.remove(temp_file)# 进行外部排序
external_sort('data.npy', chunk_size, 'sorted_data.npy')
1.19.3.3 外存排序流程图
分块排序外存算法
生成大规模数据
分块读取并排序
合并排序后的分块
生成 10GB 的数据
读取分块
排序分块
保存分块
读取所有分块
合并分块
写入输出文件
删除临时文件

1.19.4 推荐系统Top-K检索优化

在推荐系统中,Top-K 检索是一个常见的需求。本节将介绍如何使用 NumPyargsort 进行向量相似度排序,并优化 Top-K 检索的性能。

1.19.4.1 推荐系统的向量相似度排序

推荐系统中的向量相似度排序通常涉及大量的向量计算。我们可以使用 NumPyargsort 来高效地实现这一点。

import numpy as np# 生成用户和物品的向量
user_vectors = np.random.rand(1000000, 10)  # 100万用户,每个用户10维向量
item_vectors = np.random.rand(1000, 10)  # 1000个物品,每个物品10维向量# 计算相似度
def compute_similarity(user_vectors, item_vectors):"""计算用户向量和物品向量的相似度:param user_vectors: 用户向量:param item_vectors: 物品向量:return: 相似度矩阵"""user_vectors = user_vectors / np.linalg.norm(user_vectors, axis=1, keepdims=True)  # 归一化用户向量item_vectors = item_vectors / np.linalg.norm(item_vectors, axis=1, keepdims=True)  # 归一化物品向量similarity_matrix = np.dot(user_vectors, item_vectors.T)  # 计算相似度矩阵return similarity_matrix# 获取 Top-K 推荐
def get_top_k_recommendations(similarity_matrix, k):"""获取每个用户的 Top-K 推荐物品:param similarity_matrix: 相似度矩阵:param k: 推荐数量:return: Top-K 推荐索引矩阵"""# 获取每个用户的 Top-K 推荐物品索引top_k_indices = np.argsort(-similarity_matrix, axis=1)[:, :k]  # 按相似度降序排序并取前k个return top_k_indices# 计算相似度并获取 Top-K 推荐
similarity_matrix = compute_similarity(user_vectors, item_vectors)
top_k_indices = get_top_k_recommendations(similarity_matrix, k=10)# 打印前10个用户的 Top-K 推荐物品索引
print("前10个用户的 Top-K 推荐物品索引: ")
print(top_k_indices[:10])
1.19.4.2 图解相似度排序
相似度排序
生成用户和物品向量
归一化向量
计算相似度矩阵
获取 Top-K 推荐索引
生成 100万用户向量
生成 1000物品向量
归一化用户向量
归一化物品向量
计算相似度矩阵
按相似度降序排序
取前k个物品索引
稳定性验证矩阵
算法稳定时间复杂度适用场景
mergesortO(n log n)需要稳定排序
quicksortO(n log n)通用场景
heapsortO(n log n)内存受限

总结

通过本篇文章的详细讲解和示例,我们对 NumPy 中的 argsort 函数有了更深入的理解。主要内容包括:

  1. 多列排序的稳定实现方案:介绍了 lexsort 的使用方法,并测试了其稳定性。
  2. 按自定义规则排序的秘籍:展示了如何实现中文拼音排序,并提供了一个图解自定义排序函数的流程图。
  3. 分块排序外存算法实现:通过一个 10GB 数据的外部排序实现示例,展示了如何处理大规模数据。
  4. 推荐系统Top-K检索优化:介绍了推荐系统中的向量相似度排序,并通过示例展示了如何高效地进行 Top-K 检索。

希望这些内容对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。我们下一篇文章再见!

参考资料

资料名称链接
NumPy 官方文档https://numpy.org/doc/stable/
lexsort 详解https://numpy.org/doc/stable/reference/generated/numpy.lexsort.html
排序稳定性测试https://numpy.org/doc/stable/user/basics.sort.html
pypinyin 库https://pypi.org/project/pypinyin/
外存排序算法https://en.wikipedia.org/wiki/External_sorting
推荐系统Top-K检索https://towardsdatascience.com/fast-topk-search-with-numpy-384c33e04ddc
大规模数据处理https://www.jianshu.com/p/1c8b4d7b0e1a
向量相似度计算https://towardsdatascience.com/understanding-feature-vector-similarity-and-its-applications-9d505b3f08cd
外存排序实现https://www.cnblogs.com/onepixel/articles/7674659.html
推荐系统优化https://developers.google.com/machine-learning/recommendation/similar/algorithm
分块排序优化https://www.dataknowledge.cn/dhj/guanchan/1811759736723408-N.html
多列排序应用https://www.geeksforgeeks.org/numpy-lexsort-in-python/
外部排序算法https://www.oreilly.com/library/view/algorithms-in-a/9780596576469/ch06s06.html
推荐系统实战https://www.kdnuggets.com/2018/11/building-recommendation-system-python.html

这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorFlow实现逻辑回归模型

逻辑回归是一种经典的分类算法&#xff0c;广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型&#xff0c;并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先&#xff0c;我们准备两类数据点&#xff0c;分别表示两个不同…

Unity git版本管理

创建仓库的时候添加了Unity的.gitignore模版&#xff0c;在这个时候就能自动过滤不需要的文件 打开git bash之后&#xff0c;步骤git版本管理-CSDN博客 如果报错&#xff0c;尝试重新进git 第一次传会耗时较长&#xff0c;之后的更新就很快了

【AI论文】扩散对抗后训练用于一步视频生成总结

摘要&#xff1a;扩散模型被广泛应用于图像和视频生成&#xff0c;但其迭代生成过程缓慢且资源消耗大。尽管现有的蒸馏方法已显示出在图像领域实现一步生成的潜力&#xff0c;但它们仍存在显著的质量退化问题。在本研究中&#xff0c;我们提出了一种在扩散预训练后针对真实数据…

低代码系统-产品架构案例介绍、明道云(十一)

明道云HAP-超级应用平台(Hyper Application Platform)&#xff0c;其实就是企业级应用平台&#xff0c;跟微搭类似。 通过自设计底层架构&#xff0c;兼容各种平台&#xff0c;使用低代码做到应用搭建、应用运维。 企业级应用平台最大的特点就是隐藏在冰山下的功能很深&#xf…

2025年AI手机集中上市,三星Galaxy S25系列上市

2025年被认为是AI手机集中爆发的一年&#xff0c;各大厂商都会推出搭载人工智能的智能手机。三星Galaxy S25系列全球上市了。 三星Galaxy S25系列包含S25、S25和S25 Ultra三款机型&#xff0c;起售价为800美元&#xff08;约合人民币5800元&#xff09;。全系搭载骁龙8 Elite芯…

【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程

1. 简介 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;全称传输控制协议。它的特点有以下几点&#xff1a;面向连接&#xff0c;每一个TCP连接只能是点对点的&#xff08;一对一&#xff09;&#xff1b;提供可靠交付服务&#xff1b;提供全双工通信&…

2025数学建模美赛|赛题翻译|E题

2025数学建模美赛&#xff0c;E题赛题翻译 更多美赛内容持续更新中...

【Elasticsearch】Elasticsearch的查询

Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…

什么是循环神经网络?

一、概念 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类用于处理序列数据的神经网络。与传统的前馈神经网络不同&#xff0c;RNN具有循环连接&#xff0c;可以利用序列数据的时间依赖性。正因如此&#xff0c;RNN在自然语言处理、时间序列预测、语…

深入探索C++17的std::any:类型擦除与泛型编程的利器

文章目录 基本概念构建方式构造函数直接赋值std::make_anystd::in_place_type 访问值值转换引用转换指针转换 修改器emplaceresetswap 观察器has_valuetype 使用场景动态类型的API设计类型安全的容器简化类型擦除实现 性能考虑动态内存分配类型转换和异常处理 总结 在C17的标准…

物管系统赋能智慧物业管理提升服务质量与工作效率的新风潮

内容概要 在当今的物业管理领域&#xff0c;物管系统的崛起为智慧物业管理带来了新的机遇和挑战。这些先进的系统能够有效整合各类信息&#xff0c;促进数字化管理&#xff0c;从而提升服务质量和工作效率。通过物管系统&#xff0c;物业管理者可以实时查看和分析各种数据&…

分组表格antd+ react +ts

import React from "react"; import { Table, Tag } from "antd"; import styles from "./index.less"; import GroupTag from "../Tag"; const GroupTable () > {const columns [{title: "姓名",dataIndex: "nam…

【JAVA实战】如何使用 Apache POI 在 Java 中写入 Excel 文件

大家好&#xff01;&#x1f31f; 在这篇文章中&#xff0c;我们将带你深入学习如何使用 Apache POI 在 Java 中编写 Excel 文件的技巧&#xff01;&#x1f4ca;&#x1f4da; 如果你是 Java 开发者&#xff0c;或者正在探索如何处理 Excel 文件的数据&#xff0c;那么这篇文章…

使用Avalonia UI实现DataGrid

1.Avalonia中的DataGrid的使用 DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中&#xff0c;DataGrid 是一个独立的包 Avalonia.Controls.DataGrid&#xff0c;因此需要单独通过 NuGet 安装。接下来&#xff0c;将介绍如何安装和使用 DataGrid 控件。 2.安装 Dat…

C#分页思路:双列表数据组合返回设计思路

一、应用场景 需要分页查询&#xff08;并非全表查载入物理内存再筛选&#xff09;&#xff0c;返回列表1和列表2叠加的数据时 二、实现方式 列表1必查&#xff0c;列表2根据列表1的查询结果决定列表2的分页查询参数 三、示意图及其实现代码 1.示意图 黄色代表list1的数据&a…

【Linux】磁盘

没有被打开的文件 文件在磁盘中的存储 认识磁盘 磁盘的存储构成 磁盘的效率 与磁头运动频率有关。 磁盘的逻辑结构 把一面展开成线性。 通过扇区的下标编号可以推算出在磁盘的位置。 磁盘的寄存器 控制寄存器&#xff1a;负责告诉磁盘是读还是写。 数据寄存器&#xff1a;给…

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…

记录 | Docker的windows版安装

目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1&#xff1a;命令行下载方式2&#xff1a;离线包下载 二、Docker Desktop更新时间 前言 参考文章&#xff1a;Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频&#xff1a;一个视频解决D…

stack 和 queue容器的介绍和使用

1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了&#xff0c;还不了解的uu&#xff0c; 可以移步去看这篇博客哟&#xff1a; 数据结构-栈数据结构-队列 简单回顾一下&#xff0c;重要的概念其实就是后进先出&#xff0c;栈在…

JUC--ConcurrentHashMap底层原理

ConcurrentHashMap底层原理 ConcurrentHashMapJDK1.7底层结构线程安全底层具体实现 JDK1.8底层结构线程安全底层具体实现 总结JDK 1.7 和 JDK 1.8实现有什么不同&#xff1f;ConcurrentHashMap 中的 CAS 应用 ConcurrentHashMap ConcurrentHashMap 是一种线程安全的高效Map集合…