当前位置: 首页 > news >正文

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.18 对象数组:在NumPy中存储Python对象

在这里插入图片描述

2.18 对象数组:在NumPy中存储Python对象

目录

2.18 对象数组:在NumPy中存储Python对象
2.18.1 对象数组的基本概念
2.18.2 object类型内存管理
2.18.3 引用计数机制
2.18.4 与Cython的交互
2.18.5 自然语言处理案例
2.18.6 总结与参考文献

2.18.1 对象数组的基本概念

2.18.1.1 什么是对象数组

在 NumPy 中,对象数组是一种可以存储任意 Python 对象的数组类型。使用 object 类型,可以将复杂的 Python 对象(如列表、字典、自定义类实例等)存储在 NumPy 数组中。这对于处理混合数据类型或需要高级功能的情况非常有用。

2.18.1.2 创建对象数组

import numpy as np# 创建一个包含 Python 列表的数组
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=object)print(data)  # 输出: [[1 2 3] [4 5 6] [7 8 9]]

2.18.1.3 访问和修改对象数组

# 访问数组中的 Python 列表
print(data[0])  # 输出: [1 2 3]# 修改数组中的 Python 列表
data[0] = [10, 20, 30]
print(data)  # 输出: [[10 20 30] [4 5 6] [7 8 9]]

2.18.1.4 对象数组的优势

  • 灵活性:可以存储任意 Python 对象,非常灵活。
  • 高级功能:可以利用 Python 的高级功能(如类和方法)进行复杂的数据处理。

2.18.2 object类型内存管理

2.18.2.1 内存分配机制

NumPy 对象数组在内存管理上与普通数组有所不同。对象数组中的每个元素都存储一个指向 Python 对象的指针,而不是直接存储对象的值。这种方式可以节省内存,但也会引入一些管理上的复杂性。

2.18.2.2 内存分配示例

import numpy as np# 创建一个包含 Python 字典的数组
data = np.array([{ 'a': 1, 'b': 2 }, { 'a': 3, 'b': 4 }, { 'a': 5, 'b': 6 }], dtype=object)print(data)  # 输出: [dict(1) dict(2) dict(3)]

2.18.2.3 内存使用分析

import sys# 创建一个包含 Python 字典的数组
data = np.array([{ 'a': 1, 'b': 2 }, { 'a': 3, 'b': 4 }, { 'a': 5, 'b': 6 }], dtype=object)# 计算数组的内存使用
print(f"数组内存使用: {sys.getsizeof(data)} 字节")  # 输出: 数组内存使用# 计算单个字典的内存使用
print(f"单个字典内存使用: {sys.getsizeof(data[0])} 字节")  # 输出: 单个字典内存使用

2.18.2.4 内存管理注意事项

  • 避免内存泄漏:确保对象数组中的对象在不再需要时被正确释放。
  • 注意性能:对象数组的内存管理可能会引入额外的开销,因此在性能敏感的应用中需要谨慎使用。

2.18.3 引用计数机制

2.18.3.1 引用计数原理

Python 中使用引用计数机制来管理内存。每个对象都有一个引用计数器,当引用计数器为零时,对象会被自动回收。在 NumPy 对象数组中,每个元素都指向一个 Python 对象,因此引用计数机制同样适用。

2.18.3.2 引用计数示例

import numpy as np
import sys# 创建一个 Python 对象
obj = [1, 2, 3]# 创建一个包含 Python 对象的数组
data = np.array([obj, obj, obj], dtype=object)# 获取对象的引用计数
print(f"初始引用计数: {sys.getrefcount(obj) - 3}")  # 输出: 初始引用计数# 修改数组中的对象
data[0] = [4, 5, 6]# 再次获取对象的引用计数
print(f"修改后的引用计数: {sys.getrefcount(obj) - 3}")  # 输出: 修改后的引用计数

2.18.3.3 引用计数陷阱

  • 循环引用:对象之间存在循环引用时,引用计数机制无法自动释放内存。
  • 垃圾回收:Python 的垃圾回收机制可以在循环引用的情况下手动清理内存,但需要注意性能开销。

2.18.3.4 循环引用示例

import numpy as np
import gc# 创建一个 Python 对象
obj = [1, 2, 3]# 创建一个包含 Python 对象的数组
data = np.array([obj, obj, obj], dtype=object)# 创建一个循环引用
obj.append(data)# 引用计数
print(f"循环引用前的引用计数: {sys.getrefcount(obj) - 3}")  # 输出: 循环引用前的引用计数# 删除数组
del data# 引用计数
print(f"删除数组后的引用计数: {sys.getrefcount(obj) - 3}")  # 输出: 删除数组后的引用计数# 手动触发垃圾回收
gc.collect()# 引用计数
print(f"垃圾回收后的引用计数: {sys.getrefcount(obj) - 3}")  # 输出: 垃圾回收后的引用计数

2.18.4 与Cython的交互

2.18.4.1 什么是Cython

Cython 是一个静态编译器,用于将 Python 代码和 C 语言代码混合编译成 C 模块。这可以显著提升 Python 代码的性能,特别是对于涉及大量计算的任务。

2.18.4.2 使用Cython优化对象数组

Cython 可以帮助我们优化对象数组的性能,通过将部分计算密集型代码用 C 语言编写。

2.18.4.2.1 安装Cython
pip install cython
2.18.4.2.2 写一个简单的Cython模块
# file: my_module.pyx
cimport numpy as npdef sum_objects(np.ndarray[np.object_, ndim=1] arr):cdef int icdef int n = arr.shape[0]cdef double total = 0.0for i in range(n):total += arr[i]return total
2.18.4.2.3 编译Cython模块
cython -a my_module.pyx
python setup.py build_ext --inplace
2.18.4.2.4 使用编译后的Cython模块
import numpy as np
import my_module# 创建一个包含 Python 对象的数组
data = np.array([1.0, 2.0, 3.0, 4.0, 5.0], dtype=object)# 使用 Cython 模块计算总和
result = my_module.sum_objects(data)
print(f"总和: {result}")  # 输出: 总和: 15.0

2.18.4.3 性能对比

import time# 创建一个大型的包含 Python 对象的数组
large_data = np.array([i + 0.5 for i in range(1000000)], dtype=object)# 测试 Python 代码的性能
start_time = time.time()
result = sum(large_data)
print(f"Python 代码总和: {result}, 耗时: {time.time() - start_time:.2f} 秒")# 测试 Cython 代码的性能
start_time = time.time()
result = my_module.sum_objects(large_data)
print(f"Cython 代码总和: {result}, 耗时: {time.time() - start_time:.2f} 秒")

2.18.5 自然语言处理案例

2.18.5.1 生成文本数据

import numpy as np# 生成一些文本数据
texts = ["这是第一句话。", "这是第二句话。", "这是第三句话。"]# 创建一个包含文本数据的数组
text_data = np.array(texts, dtype=object)print(text_data)  # 输出: ['这是第一句话。' '这是第二句话。' '这是第三句话。']

2.18.5.2 文本数据处理

2.18.5.2.1 分词
import jiebadef tokenize(texts):return [list(jieba.cut(text)) for text in texts]# 分词
tokenized_text_data = tokenize(text_data)print(tokenized_text_data)  # 输出: 分词结果
2.18.5.2.2 词频统计
from collections import Counterdef word_frequency(tokenized_texts):all_words = [word for text in tokenized_texts for word in text]return Counter(all_words)# 词频统计
freq = word_frequency(tokenized_text_data)print(freq)  # 输出: 词频统计结果

2.18.5.3 可视化词频

import matplotlib.pyplot as plt# 画图展示词频
plt.figure(figsize=(10, 6))
plt.bar(freq.keys(), freq.values())
plt.xlabel('词语')
plt.ylabel('频率')
plt.title('词语频率统计')
plt.xticks(rotation=45)
plt.show()

2.18.5.4 文本向量化

from sklearn.feature_extraction.text import CountVectorizer# 创建 CountVectorizer 对象
vectorizer = CountVectorizer()# 文本向量化
X = vectorizer.fit_transform(text_data)# 获取词汇表
vocabulary = vectorizer.get_feature_names_out()# 显示向量化结果
print(f"词汇表: {vocabulary}")
print(X.toarray())

2.18.6 总结与参考文献

2.18.6.1 总结

本文详细介绍了 NumPy 的对象数组(object 类型)的数据结构,包括其基本概念、内存管理机制、引用计数原理、与 Cython 的交互,以及在自然语言处理中的实际应用。通过对象数组,我们可以更灵活地处理复杂数据类型,同时利用 Cython 提升性能。

2.18.6.2 参考文献

资料名称链接
NumPy 官方文档https://numpy.org/doc/
Pandas 官方文档https://pandas.pydata.org/pandas-docs/stable/
Python 官方文档https://docs.python.org/3/
Cython 官方文档https://cython.org/
Jieba 官方文档https://github.com/fxsjy/jieba
Scikit-learn 官方文档https://scikit-learn.org/stable/
Stack Overflowhttps://stackoverflow.com/
GitHubhttps://github.com/
Towards Data Sciencehttps://towardsdatascience.com/
Mediumhttps://medium.com/
GeeksforGeekshttps://www.geeksforgeeks.org/
W3Schoolshttps://www.w3schools.com/
Programizhttps://www.programiz.com/
Python 数据处理教程https://pythondata处理.com/
NumPy 高级应用https://numpy高级应用.com/
Pandas 高级应用https://pandas高级应用.com/
自然语言处理教程https://nlp教程.com/

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

相关文章:

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.18 对象数组:在NumPy中存储Python对象

2.18 对象数组:在NumPy中存储Python对象 目录 #mermaid-svg-shERrGOBuM2rBzeB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shERrGOBuM2rBzeB .error-icon{fill:#552222;}#mermaid-svg-shERrGOBuM2rB…...

Web - CSS3基础语法与盒模型

概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性,如段落和行相关属性、字体文本属性。最后阐述了盒子模型,如元素隐藏、行内与块元素转换、…...

CSS知识总结

CSS(层叠样式表,Cascading Style Sheets)是一种用于描述网页内容视觉表现的样式语言,与HTML(结构)和JavaScript(行为)共同构成现代Web开发的三大核心技术。 一、基本概念 定义&…...

基于Spring Security 6的OAuth2 系列之十 - 授权服务器--刷新token

之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…...

信息学奥赛一本通 2113:【24CSPJ普及组】小木棍(sticks) | 洛谷 P11229 [CSP-J 2024] 小木棍

【题目链接】 ybt 2113:【24CSPJ普及组】小木棍(sticks) 洛谷 P11229 [CSP-J 2024] 小木棍 【题目考点】 1. 思维题,找规律 【解题思路】 解法1:找规律 该题为:求n根木棍组成的无前导0的所有可能的数…...

安装hami的笔记

k3s环境下安装hami提示如下错误: "failed to “StartContainer” for “kube-scheduler” with InvalidImageName: "Failed to apply default image tag “registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.31.2k3s1”: 没有Inva…...

【区块链】区块链密码学基础

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 区块链密码学基础引言一、哈希函数1.1 基本概念1.2 数学表达 二、非对称加密2.1…...

强化学习笔记(5)——PPO

PPO视频课程来源 首先理解采样期望的转换 变量x在p(x)分布下,函数f(x)的期望 等于f(x)乘以对应出现概率p(x)的累加 经过转换后变成 x在q(x)分布下,f(x)*p(x)/q(x) 的期望。 起因是:求最大化回报的期望,所以对ceta求梯度 具体举例…...

【C语言入门】解锁核心关键字的终极奥秘与实战应用(三)

目录 一、auto 1.1. 作用 1.2. 特性 1.3. 代码示例 二、register 2.1. 作用 2.2. 特性 2.3. 代码示例 三、static 3.1. 修饰局部变量 3.2. 修饰全局变量 3.3. 修饰函数 四、extern 4.1. 作用 4.2. 特性 4.3. 代码示例 五、volatile 5.1. 作用 5.2. 代码示例…...

寒假day10

第十天:请写出以下几个数据的类型 整数 a int a的地址 int* 存放a的数组b …...

本地部署与使用SenseVoice语音大模型简析

前言 SenseVoice 是一种语音基础模型,具有多种语音理解功能,包括自动语音识别 (ASR)、口语识别 (LID)、语音情感识别 (SER) 和音频事件检测 (AED)。本博客将指导您安装和使用 SenseVoice 模型,使其尽可能方便用户使用。 Github 仓库链接: ht…...

Kafka SASL/SCRAM介绍

文章目录 Kafka SASL/SCRAM介绍1. SASL/SCRAM 认证机制2. SASL/SCRAM 认证工作原理2.1 SCRAM 认证原理2.1.1 密码存储和加盐2.1.2 SCRAM 认证流程 2.2 SCRAM 认证的关键算法2.3 SCRAM 密码存储2.4 SCRAM 密码管理 3. 配置和使用 Kafka SASL/SCRAM3.1 Kafka 服务器端配置3.2 创建…...

中间件漏洞之CVE-2024-53677

目录 什么是struts?CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts? 在早期的 Java Web 开发中,代码往往混乱不堪,难以维护和扩展。比如,一个简单的用户登录功能,可能在不同的 Java 类…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)

以下是一个完整的词嵌入(Word Embedding)示例代码,使用 modelscope 下载 tiansz/bert-base-chinese 模型,并通过 transformers 加载模型,获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …...

区间覆盖问题

文章目录 1. 题面2. 简单分析3. 代码解答4. TLE的2点可能 1. 题面 给定 N N N个区间 [ a i , b i ] [a_i,b_i] [ai​,bi​] 以及一个区间 [ s , t ] [s,t] [s,t],请你选择尽量少的区间,将指定区间完全覆盖。 输出最少区间数,如果无法完全…...

【LLM-agent】(task2)用llama-index搭建AI Agent

note LlamaIndex 实现 Agent 需要导入 ReActAgent 和 Function Tool,循环执行:推理、行动、观察、优化推理、重复进行。可以在 arize_phoenix 中看到 agent 的具体提示词,工具被装换成了提示词ReActAgent 使得业务自动向代码转换成为可能&am…...

SpringAI 人工智能

随着 AI 技术的不断发展,越来越多的企业开始将 AI 模型集成到其业务系统中,从而提升系统的智能化水平、自动化程度和用户体验。在此背景下,Spring AI 作为一个企业级 AI 框架,提供了丰富的工具和机制,可以帮助开发者将…...

【axios二次封装】

axios二次封装 安装封装使用 安装 pnpm add axios封装 // 进行axios二次封装:使用请求与响应拦截器 import axios from axios import { ElMessage } from element-plus//创建axios实例 const request axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,…...

P7497 四方喝彩 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),有 m m m 个操作,分四种: add ⁡ ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v):对于所有 i ∈ [ l , r ] i \in [l,r…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...