np.loadtxt()报错因默认空格分隔,读CSV需显式设delimiter=',';不支持header、NaN、混合类型,应改用pandas.read_csv()或np.genfromtxt()。

np.loadtxt()读CSV时为啥报错“could not convert string to float”
因为默认按空格分割,遇到逗号分隔的CSV直接把整行当一个字符串塞进转换流程,np.loadtxt()根本没识别分隔符。它不是为CSV设计的,只是碰巧能读纯数字文本。
- 必须显式传
delimiter=',',否则默认空格或制表符 - 如果首行是列名(header),得加
skiprows=1,否则会尝试转字符串为数字 - 含缺失值(如空单元格或
"N/A")时,np.loadtxt()直接崩,得换np.genfromtxt() - 混合类型(比如一列是字符串、一列是数字)不支持——它只返回单一dtype数组
np.savetxt()保存带标题的CSV要自己拼接
np.savetxt()压根不管表头,只写数值矩阵。想存成带列名的CSV,得手动处理字符串拼接,不能指望它自动加一行文字。
- 先用
np.savetxt()写数据,再用普通文件操作写 header 行(推荐open(..., 'w')先写再追加) -
fmt参数控制数字格式,比如fmt='%.3f'保留三位小数;若含整数混写,统一用fmt='%s'+dtype=str转字符串再存 - 别漏掉
delimiter=',',否则默认空格,生成的不是合法CSV - Windows下注意换行符:加
newline=''到open(),避免双换行
什么时候该放弃loadtxt/savetxt,改用pandas
只要CSV里有列名、空值、混合类型(比如日期+数字)、需要筛选或补全,np.loadtxt()和np.savetxt()就该让位。它们不是CSV工具,是轻量级纯数值文本搬运工。
- 读取含 header/NaN/字符串列 → 用
pandas.read_csv() - 保存带 index 或 column 名 → 用
df.to_csv() - 后续还要做计算?可以再从
df.values提纯 NumPy 数组,但读写环节别硬扛 - 性能不是问题:pandas 对 CSV 的底层解析其实比
np.loadtxt()更稳更快,尤其带缺失值时
np.genfromtxt() 是 loadtxt 的“增强兼容版”,但仍有边界
它能填缺失值、跳过坏行、自动推 dtype,看起来像 CSV 救星,但实际用起来约束不少。
- 设
missing_values=''和filling_values=np.nan才能处理空单元格 -
names=True可读 header 并生成结构化数组,但字段名不能含空格或特殊符号 - 即使设了
dtype=None,返回的仍是结构化数组(np.ndarraywithdtype=[('col1', '<f8 ...>),不是二维普通数组,后续广播运算容易出错</f8> - 大文件时比 pandas 慢,且内存占用更高——它先把全量转成 object 类型再推导,不流式解析
np.loadtxt() 上反复调参数,不如直接切到 pandas 读完再转 .values。










