pin_drop当前位置:知识文库 ❯ 图文

NumPy文件读写完整指南 - npy/npz/CSV格式

一、概述

NumPy提供了多种文件读写方式,包括二进制格式(npy/npz)和文本格式(CSV/TXT)的读写。npy是NumPy专有的二进制格式,读写速度快且保留数据类型信息;npz支持多个数组的压缩存储;文本格式兼容性好但速度较慢。

选择合适的格式取决于数据大小和兼容性需求。对于大型NumPy数组的内部存储,推荐npy/npz格式;对于需要与Excel、pandas等外部工具共享的数据,CSV格式更为合适。


二、语法与常用函数

代码示例

# 二进制格式
np.save('file.npy', arr)
np.load('file.npy')
np.savez('file.npz', a=arr1, b=arr2)
np.savez_compressed('file.npz', a=arr1, b=arr2)

# 文本格式
np.savetxt('file.txt', arr, delimiter=',')
np.loadtxt('file.txt', delimiter=',')
np.genfromtxt('file.txt', delimiter=',', skip_header=1)

三、参数说明

np.save / np.load

参数 类型 默认值 说明
file str/file 必填 文件路径
arr ndarray 必填 要保存的数组
allow_pickle bool True 是否允许pickle

np.savetxt

参数 类型 默认值 说明
fname str 必填 文件路径
X ndarray 必填 要保存的数组
fmt str '%.18e' 格式化字符串
delimiter str ' ' 分隔符
header str '' 文件头注释
comments str '# ' 注释前缀

np.loadtxt

参数 类型 默认值 说明
fname str 必填 文件路径
delimiter str None 分隔符
skiprows int 0 跳过行数
dtype dtype float 数据类型
encoding str None 文件编码

四、npy二进制格式读写

np.save()将单个数组保存为npy格式,np.load()加载npy文件。npy格式完整保留数组的shape、dtype等元信息,读写速度极快。

代码示例

import numpy as np

# 创建数组
arr = np.arange(12).reshape(3, 4)
print(f"原数组:\n{arr}")
print(f"数据类型: {arr.dtype}")

# 保存为npy格式
np.save('test_array.npy', arr)

# 加载npy文件
loaded = np.load('test_array.npy')
print(f"\n加载的数组:\n{loaded}")
print(f"加载数据类型: {loaded.dtype}")

# 验证数据一致性
print(f"数据一致: {np.array_equal(arr, loaded)}")

输出结果:

代码示例

原数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
数据类型: int32

加载的数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
加载数据类型: int32
数据一致: True

五、npz多数组存储

np.savez()将多个数组存储到一个npz文件中(不压缩),np.savez_compressed()提供压缩功能,可节省磁盘空间。加载npz文件返回NpzFile对象,通过键名访问各个数组。

代码示例

import numpy as np

# 创建多个数组
data = np.random.default_rng(42).random((100, 5))
labels = np.random.default_rng(42).integers(0, 3, 100)
feature_names = np.array(['height', 'weight', 'age', 'score', 'level'])

# 保存多个数组(压缩)
np.savez_compressed('dataset.npz',
                    data=data,
                    labels=labels,
                    feature_names=feature_names)

# 加载npz文件
dataset = np.load('dataset.npz')
print(f"包含的数组: {list(dataset.keys())}")
print(f"data shape: {dataset['data'].shape}")
print(f"labels shape: {dataset['labels'].shape}")
print(f"feature_names: {dataset['feature_names']}")

# 关闭文件
dataset.close()

输出结果:

代码示例

包含的数组: ['data', 'labels', 'feature_names']
data shape: (100, 5)
labels shape: (100,)
feature_names: ['height' 'weight' 'age' 'score' 'level']

小贴士

npz文件本质上是一个zip压缩包,内部包含多个npy文件。savez_compressed对每个数组单独压缩,对数值数组压缩效果较好。加载后建议使用with语句或手动调用close()释放资源。


六、文本格式读写

np.savetxt()将数组保存为文本文件,np.loadtxt()np.genfromtxt()用于读取文本文件。genfromtxt比loadtxt更灵活,支持缺失值处理。

代码示例

import numpy as np

# 创建数组并保存为CSV
arr = np.arange(20).reshape(4, 5)
np.savetxt('data.csv', arr, delimiter=',', fmt='%d',
           header='col1,col2,col3,col4,col5', comments='')

# 读取CSV文件
loaded = np.loadtxt('data.csv', delimiter=',', skiprows=1, dtype=int)
print(f"加载的CSV数据:\n{loaded}")

# genfromtxt:更灵活的读取(处理缺失值)
csv_content = """1.0,2.0,3.0
4.0,nan,6.0
7.0,8.0,9.0"""
with open('data_nan.csv', 'w') as f:
    f.write(csv_content)

data = np.genfromtxt('data_nan.csv', delimiter=',')
print(f"\n含缺失值的数据:\n{data}")
print(f"缺失值填充为nan: {np.isnan(data)}")

输出结果:

代码示例

加载的CSV数据:
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

含缺失值的数据:
[[ 1.  2.  3.]
 [ 4. nan  6.]
 [ 7.  8.  9.]]
缺失值填充为nan: [[False False False]
 [False  True False]
 [False False False]]

七、实际应用场景

  • 场景1:机器学习中,将预处理后的数据保存为npy格式,加速后续加载,避免重复预处理

  • 场景2:数据共享中,使用CSV格式导出数据,兼容Excel、pandas和其他数据分析工具

  • 场景3:模型训练中,使用npz保存训练集、验证集和测试集到同一文件,方便统一管理


八、注意事项

注意:npy格式保留数据类型信息,文本格式读取后默认为float64,需手动指定dtype参数以避免类型转换。

注意:np.load()加载npz文件返回NpzFile对象,使用后应调用close()或使用with语句,避免文件句柄泄漏。

注意:savetxt只能保存一维和二维数组,高维数组需先reshape为2D再保存。


九、文件格式对比

格式 扩展名 速度 数据类型保留 多数组 文件大小
npy .npy 极快 保留 不支持
npz .npz 保留 支持 小(压缩)
CSV .csv 不保留 不支持
TXT .txt 不保留 不支持

十、练习题

练习1

创建一个5x5的随机浮点数组,保存为npy格式,重新加载并验证数据一致性

练习2

创建三个不同形状的数组,使用savez_compressed保存到同一文件,加载后分别打印shape

练习3

创建一个4x3的整数数组,保存为CSV格式(逗号分隔),然后用loadtxt加载并打印

常见问题

npy格式和CSV格式应该如何选择?

如果只在NumPy/Python环境使用,选择npy格式,读写速度快且保留数据类型。如果需要与Excel或其他软件共享数据,选择CSV格式。对于大型数据集,npy的读写速度优势更加明显。

loadtxt和genfromtxt有什么区别?

genfromtxt比loadtxt更灵活,支持处理缺失值(自动填充为nan)、自动推断列名、处理不规则数据等。但genfromtxt速度稍慢。如果数据干净且格式规则,loadtxt更简单高效。

为什么savetxt只能保存一维和二维数组?

文本文件本质上是二维的(行和列),三维及以上的数组无法直接映射到文本格式。如果需要保存高维数组,可以先reshape为2D,或者使用npy/npz格式。

npz文件压缩效果如何?

npz压缩使用的是zip算法,对数值型数组(特别是有很多0或重复值时)压缩效果明显。对于完全随机的浮点数,压缩率较低。如果需要更高压缩率,可考虑使用h5py等专用格式。

标签: NumPy 文件读写 npy格式 CSV npz压缩 savetxt

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: NumPy随机数生成器教程 - 概率分布与随机采样 下一篇: NumPy数组排序详解 - sort/argsort/partition

poll相关推荐