【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 TB
    A[自定义排序函数]
    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.itemsize
    total_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 = None
        min_value = float('inf')
        for i, chunk in enumerate(chunks):
            if len(chunk) > 0 and chunk[0] < min_value:
                min_value = chunk[0]
                min_index = i
        
        if min_index is None:
            break

        # 将最小值写入输出文件
        output_file.write(chunks[min_index][0].tobytes())
        
        # 更新分块读取索引
        indices[min_index] += 1
        chunks[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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式数据库应用实践:架构设计与性能优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在当今数据驱动的世界中&#xff0c;分布式数据库因其高可用性、可扩展性和强大的容错能力&#xff0c;已成为现代企业存储…

实战纪实 | 真实HW漏洞流量告警分析

视频教程在我主页简介和专栏里 目录&#xff1a; 一、web.xml 文件泄露 二、Fastjson 远程代码执行漏洞 三、hydra工具爆破 四、绕过验证&#xff0c;SQL攻击成功 五、Struts2代码执行 今年七月&#xff0c;我去到了北京某大厂参加HW行动&#xff0c;因为是重点领域—-jr&…

一组开源、免费、Metro风格的 WPF UI 控件库

前言 今天大姚给大家分享一个开源、免费、Metro风格的 WPF UI 控件库&#xff1a;MahApps.Metro。 项目介绍 MahApps.Metro 是一个开源、免费、Metro风格的 WPF UI 控件库&#xff0c;提供了现代化、平滑和美观的控件和样式&#xff0c;帮助开发人员轻松创建具有现代感的 Win…

12 款开源OCR发 PDF 识别框架

2024 年 12 款开源文档解析框架的选型对比评测&#xff1a;PDF解析、OCR识别功能解读、应用场景分析及优缺点比较 这是该系列的第二篇文章&#xff0c;聚焦于智能文档处理&#xff08;特别是 PDF 解析&#xff09;。无论是在模型预训练的数据收集阶段&#xff0c;还是基于 RAG…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 基本查询回顾 假设有以下表结构&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

jemalloc 5.3.0的tsd模块的源码分析

一、背景 在主流的内存库里&#xff0c;jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大&#xff0c;低版本的诸多网上整理的总结&#xff0c;无论是在概念上和还是在结构体命名上在新版本中很多都…

【Docker】快速部署 Nacos 注册中心

【Docker】快速部署 Nacos 注册中心 引言 Nacos 注册中心是一个用于服务发现和配置管理的开源项目。提供了动态服务发现、服务健康检查、动态配置管理和服务管理等功能&#xff0c;帮助开发者更轻松地构建微服务架构。 步骤 拉取镜像 docker pull nacos/nacos-server启动容器…

DiffuEraser: 一种基于扩散模型的视频修复技术

视频修复算法结合了基于流的像素传播与基于Transformer的生成方法&#xff0c;利用光流信息和相邻帧的信息来恢复纹理和对象&#xff0c;同时通过视觉Transformer完成被遮挡区域的修复。然而&#xff0c;这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题&#xff0…

【JavaEE进阶】图书管理系统 - 壹

目录 &#x1f332;序言 &#x1f334;前端代码的引入 &#x1f38b;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f343;后端服务器代码实现 &#x1f6a9;登录接口 &#x1f6a9;图书列表接口 &#x1f384;前端代码实现 &#x1f6a9;登录页面 &#x1f6a9;…

[权限提升] 操作系统权限介绍

关注这个专栏的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 权限提升简称提权&#xff0c;顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;我们通过 Web 漏洞拿到的 Web 进程的…

【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的美赛O奖、国赛国一的数学建模团队&#xff0c;我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解析&#xff0c…

linux如何修改密码,要在CentOS 7系统中修改密码

要在CentOS 7系统中修改密码&#xff0c;你可以按照以下步骤操作&#xff1a; 步骤 1: 登录到系统 在登录提示符 localhost login: 后输入你的用户名。输入密码并按回车键。 步骤 2: 修改密码 登录后&#xff0c;使用 passwd 命令来修改密码&#xff1a; passwd 系统会提…

抗体人源化服务如何优化药物的分子结构【卡梅德生物】

抗体药物作为一种重要的生物制药产品&#xff0c;已在癌症、免疫疾病、传染病等领域展现出巨大的治疗潜力。然而&#xff0c;传统的抗体药物常常面临免疫原性高、稳定性差以及治疗靶向性不足等问题&#xff0c;这限制了其在临床应用中的效果和广泛性。为了克服这些问题&#xf…

大模型概述

文章目录 大语言模型的起源大语言模型的训练方式大语言模型的发展大语言模型的应用场景大语言模型的基础知识LangChain与大语言模型 大语言模型的起源 在人类社会中&#xff0c;我们的交流语言并非单纯由文字构成&#xff0c;语言中富含隐喻、讽刺和象征等复杂的含义&#xff0…

关于数字地DGND和模拟地AGND隔离

文章目录 前言一、1、为什么要进行数字地和模拟地隔离二、隔离元件1.①0Ω电阻&#xff1a;2.②磁珠&#xff1a;3.电容&#xff1a;4.④电感&#xff1a; 三、隔离方法①单点接地②数字地与模拟地分开布线&#xff0c;最后再PCB板上一点接到电源。③电源隔离④、其他隔离方法 …

【Redis】常见面试题

什么是Redis&#xff1f; Redis 和 Memcached 有什么区别&#xff1f; 为什么用 Redis 作为 MySQL 的缓存&#xff1f; 主要是因为Redis具备高性能和高并发两种特性。 高性能&#xff1a;MySQL中数据是从磁盘读取的&#xff0c;而Redis是直接操作内存&#xff0c;速度相当快…

什么是循环神经网络?

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

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…

19.Word:小马-校园科技文化节❗【36】

目录 题目​ NO1.2.3 NO4.5.6 NO7.8.9 NO10.11.12索引 题目 NO1.2.3 布局→纸张大小→页边距&#xff1a;上下左右插入→封面&#xff1a;镶边→将文档开头的“黑客技术”文本移入到封面的“标题”控件中&#xff0c;删除其他控件 NO4.5.6 标题→原文原文→标题 正文→手…

一文讲解Java中Object类常用的方法

在Java中&#xff0c;经常提到一个词“万物皆对象”&#xff0c;其中的“万物”指的是Java中的所有类&#xff0c;而这些类都是Object类的子类&#xff1b; Object主要提供了11个方法&#xff0c;大致可以分为六类&#xff1a; 对象比较&#xff1a; public native int has…