讲师中心 微信公众号
AI工具推荐 视频效率加速

如何解决Python中NumPy读取包含字符串的混合数组_通过定义struct类型

秋墨小哥_4122

秋墨小哥_4122

发布时间:2026-05-29 14:44:06

|

568人浏览过

|

来源于php中文网

原创

np.loadtxt读含字符串CSV报错因默认全转float,解决需用结构化dtype显式定义各列类型与名称,如dtype=[('name','U10'),('age','i4'),('height','f4')],并指定encoding='utf-8'。

如何解决python中numpy读取包含字符串的混合数组_通过定义struct类型

为什么 np.loadtxt 读含字符串的CSV会报错“could not convert string to float”

因为 np.loadtxt 默认把所有列都当数值处理,遇到 "apple" 或 "2023-01-01" 这类非数字字段时,直接抛 ValueError: could not convert string to float。它不自动推断混合类型,也不支持字段名或结构化语义。

解决思路不是硬转成 object 数组(性能差、无法向量化),而是显式定义 dtype 为结构体(structured dtype)——让 NumPy 知道每列是什么类型、叫什么名字。

  • 必须提前知道各列数据类型(比如第0列是字符串、长度≤20;第1列是整数;第2列是浮点)
  • 字符串列要用 U20(Unicode)或 S20(bytes),不能写 str 或 string
  • np.loadtxt 的 dtype 参数只接受元组或列表形式的结构定义,不能传字典(np.genfromtxt 才支持字典式 dtype)

怎么用 np.loadtxt 配合结构化 dtype 正确读取混合数据

假设你有文件 data.csv,三列:姓名(字符串)、年龄(整数)、身高(浮点),用逗号分隔:

Tom,25,178.5
Alice,31,162.3
Bob,22,185.0

对应结构化 dtype 写法是:

立即学习“Python免费学习笔记(深入)”;

NumPy Linux版 2.4.2
NumPy Linux版 2.4.2

NumPy 2.4.2 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、科学计算脚本复现和指定环境安装。

下载
dtype = np.dtype([('name', 'U10'), ('age', 'i4'), ('height', 'f4')])

然后调用:

data = np.loadtxt('data.csv', delimiter=',', dtype=dtype, encoding='utf-8')
  • 'U10' 表示最多10个 Unicode 字符,超出会被截断;若不确定长度,可设大些如 'U50',但别盲目用 'U1000'(浪费内存)
  • encoding='utf-8' 必须显式指定,否则 Python 3 下默认用系统编码,中文路径或内容易出 UnicodeDecodeError
  • 列数必须与 dtype 字段数严格一致;若 CSV 有标题行,加 skiprows=1,否则字段名会混进第一行数据

用 np.genfromtxt 更省心?但它也有坑

np.genfromtxt 支持更灵活的 dtype 写法(比如字典形式),还能自动跳过坏行、处理缺失值,看似更友好。但要注意:

  • 如果没设 dtype=None 或明确结构,它默认仍尝试转 float,照样报错
  • 正确写法是:np.genfromtxt('data.csv', delimiter=',', dtype={'names': ('name','age','height'), 'formats': ('U10', 'i4', 'f4')}, encoding='utf-8')
  • 它比 loadtxt 慢不少,尤其数据量大时;且返回的是 masked array(带 mask 属性),若后续不做缺失值处理,纯属冗余
  • 空字符串或全空白列会被识别为缺失,触发 mask,导致数组变 np.ma.MaskedArray 类型——很多下游函数(如 np.where)不兼容

读出来之后怎么安全访问字段和做计算

结构化数组不是二维数组,不能用 data[0][1] 或 data[:, 1]。必须用字段名索引:

names = data['name']      # 返回一维 U10 数组
ages = data['age']        # 返回一维 i4 数组
adults = data[data['age'] >= 30]  # 布尔索引,返回子结构数组
  • 字段名访问是常数时间,比切片快;但不能对整个结构数组直接调 .sum() 或 .mean(),得指定字段,如 data['height'].mean()
  • 如果要转成 pandas DataFrame,直接传 pd.DataFrame(data) 即可,字段名自动成为列名
  • 注意:结构化数组的 shape 是一维(如 (3,)),不是 (3, 3);想看“表格感”,用 data.view((float, len(data.dtype.names))) 是危险操作,会破坏类型对齐,别这么干

最易被忽略的一点:结构化 dtype 定义一旦写死,就锁死了字段顺序和类型。如果 CSV 列顺序变了,或者某列实际出现了超长字符串,NumPy 不会报错,只会静默截断或填充——得靠你自己在读入后加校验,比如 np.char.str_len(data['name']).max() <= 10。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1771

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4584

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1729

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

26997

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3267

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3267

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1203

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
NumPy 官方文档与用户指南
NumPy 官方文档与用户指南

共0课时 | 0人学习

SciPy 教程
SciPy 教程

共10课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn