genfromtxt默认不填充缺失值,因其仅将显式空字段(如“1,,3”中的双逗号)识别为缺失,需显式指定missing_values和filling_values才能处理空格、制表符或“N/A”等形态。

genfromtxt 读取缺失值时为什么默认不填充
genfromtxt 遇到空字段或非法格式(如字母混在数字列中)时,会将对应位置设为 np.nan,但前提是明确告诉它哪些是缺失标记。它不会自动把空字符串、制表符间隙或连续分隔符当成缺失——除非你显式指定 missing_values 和 filling_values。
常见错误现象:genfromtxt("data.txt") 返回全 np.nan 的列,或直接报 ValueError: Invalid value encountered,其实只是它卡在某行解析失败,没继续往下读。
- 默认的
missing_values是空字符串'',但仅对**显式空字段**生效(如1,,3中的中间逗号);对末尾换行前的空白、多余制表符、或整行缺字段等情况无效 -
filling_values必须与数据列数一致:单个值(如-999)会广播到所有列;元组(如(0, -1, 1.0))则按列分别填充 - 若文件含混合类型(如首行是标题),务必加
skip_header=1,否则第一行会被当数据解析,导致类型推断崩溃
如何用 filling_values 精准控制每列默认值
填充值不是“兜底”,而是按列语义设置的合理替代。比如时间戳列填 0,分类 ID 列填 -1,浮点测量值填 np.nan —— 这些必须写成元组,长度等于有效列数。
实操关键:先用 delimiter 和 usecols 锁定结构,再配 filling_values。否则列数算错,filling_values 元组长度不匹配会直接报错。
立即学习“Python免费学习笔记(深入)”;
- 确认列数:用文本编辑器打开
data.txt,数清楚实际数据列(跳过注释行、标题行后) - 示例:3 列数据,想让第1列空值填
0,第2列填-1,第3列填np.nan→ 写成filling_values=(0, -1, np.nan) - 如果某列是字符串类型(比如含 "N/A"),需同时设
dtype=str,否则filling_values会被强制转成 float 导致异常
missing_values 参数要匹配原始文本中的“空”形态
空不等于“看不见”。genfromtxt 只认你写的字符串,不会自动归一化空白。一个字段是 " "(空格)、"\t"(制表符)、"N/A" 还是 "",必须逐个列在 missing_values 里。
常见陷阱:用 missing_values=" " 想匹配所有空白,结果失效——因为单个空格 ≠ 多个空格 ≠ 制表符。正确做法是用字典按列指定,或统一预处理。
- 按列指定更安全:例如
missing_values={'f0': ' ', 'f1': 'N/A', 'f2': ''}(f0是第0列别名) - 若整文件统一用
"NULL"表示缺失,写missing_values="NULL"即可 - 避免用正则或通配符:该参数不支持模式匹配,
"*"或r"\s*"都会被当字面量处理
比 genfromtxt 更稳的替代方案:pandas.read_csv + to_numpy()
当缺失形态复杂(如混合空格/制表符/注释/多级标题)、或需类型回退(某列多数是数字,个别是字符串),genfromtxt 很容易崩。此时用 pandas.read_csv 更鲁棒,它内置缺失识别逻辑,且能自动降级类型。
性能不是问题:小到几 MB、大到百 MB 的 txt,read_csv 解析速度通常不低于 genfromtxt,尤其开了 engine='c'(默认)和 dtype 预声明时。
- 等效操作:
pd.read_csv("data.txt", sep=r'\s+', na_values=['', 'N/A', 'NULL'], keep_default_na=True).to_numpy() - 优势:自动跳过纯空白行、智能处理引号包围字段、支持
comment='#'忽略注释行 - 注意:返回的是
object数组(若列类型不一致),需加dtype=float或用.values.astype(float)强制转换,否则后续 NumPy 运算报错
真正麻烦的不是怎么填,默认值逻辑本身简单;难的是搞清原始文件里“空”到底长什么样——多用 head -n 5 data.txt | cat -A 看不可见字符,比反复调参快得多。


















