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
np.savetxt
np.loadtxt
四、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再保存。
九、文件格式对比
十、练习题
练习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等专用格式。
本文涉及AI创作
内容由AI创作,请仔细甄别