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

秋墨小哥_4122

秋墨小哥_4122

2026-05-29

568人浏览

原创

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 写法是:

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() 。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.07.20

1751

4

python能做什么
python能做什么

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

2023.07.25

4564

7

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

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

2023.07.31

1729

3

python教程
python教程

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

2023.08.03

26897

23

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

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

2023.08.04

3247

5

python eval
python eval

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

2023.08.04

3267

5

scratch和python区别
scratch和python区别

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

2023.08.11

1203

5

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

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

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

热门下载

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

精品课程

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

共0课时 | 0人学习

SciPy 教程
SciPy 教程

共10课时 | 4.1万人学习