NumPy IO
NumPy 提供了丰富的输入/输出(I/O)功能,用于从文件读取数据或将数据保存到文件。这些功能通过 numpy
模块中的函数实现,支持多种文件格式(如文本文件、CSV 文件、二进制文件等),非常适合处理科学计算中的数据。以下是对 NumPy I/O 功能的详细中文讲解,涵盖主要函数、用法、示例和注意事项。
1. 概述
NumPy 的 I/O 功能主要用于:
- 读取数据:从文本文件(如
.txt
、.csv
)或二进制文件加载数组数据。 - 保存数据:将 NumPy 数组保存为文本文件或二进制文件。
- 支持格式:包括纯文本、CSV、NumPy 专用的
.npy
和.npz
格式等。
常用的 I/O 函数位于 numpy
模块中,部分高级功能需要配合其他库(如 pandas
)处理复杂数据格式。
2. 常用 I/O 函数
以下是 NumPy 中最常用的 I/O 函数及其功能:
函数 | 功能描述 |
---|---|
np.loadtxt() | 从文本文件(如 .txt 、.csv )读取数据,生成数组 |
np.savetxt() | 将数组保存为文本文件 |
np.genfromtxt() | 类似 loadtxt ,但更适合处理缺失值或复杂格式 |
np.save() | 将数组保存为 NumPy 专用的 .npy 二进制文件 |
np.savez() | 将多个数组保存为压缩的 .npz 文件 |
np.load() | 从 .npy 或 .npz 文件加载数据 |
3. 文本文件操作
文本文件(如 .txt
、.csv
)是最常见的数据存储格式,NumPy 提供了 np.loadtxt()
和 np.genfromtxt()
用于读取,np.savetxt()
用于保存。
3.1 使用 np.loadtxt()
读取文本文件
np.loadtxt()
从文本文件加载数据,适合格式规整的文件。
参数:
fname
:文件名或文件对象。dtype
:数据类型(如float
、int
),默认float
。delimiter
:分隔符(如','
、' '
),默认是空格。skiprows
:跳过前几行。usecols
:指定要读取的列(索引或列名)。
示例:
假设有一个文件 data.txt
:
1 2 3
4 5 6
7 8 9
import numpy as np
# 读取文本文件
data = np.loadtxt('data.txt')
print(data)
# 输出:
# [[1. 2. 3.]
# [4. 5. 6.]
# [7. 8. 9.]]
# 读取 CSV 文件(逗号分隔)
data_csv = np.loadtxt('data.csv', delimiter=',')
处理复杂文件:
如果文件包含标题或注释,可以用 skiprows
或 comments
参数:
# 假设 data.txt 第一行是标题
data = np.loadtxt('data.txt', skiprows=1) # 跳过第一行
3.2 使用 np.genfromtxt()
处理复杂数据
np.genfromtxt()
是 np.loadtxt()
的增强版,适合处理缺失值或不规则数据。
额外参数:
missing_values
:指定缺失值的标识(如'NA'
、''
)。filling_values
:缺失值的填充值(如0
)。names
:从文件读取列名(如果文件包含标题)。
示例:
假设有一个文件 data_missing.csv
:
x,y,z
1,2,3
4,,6
7,8,9
data = np.genfromtxt('data_missing.csv', delimiter=',', names=True, filling_values=0)
print(data)
# 输出:
# [(1., 2., 3.) (4., 0., 6.) (7., 8., 9.)]
# 访问特定列
print(data['y']) # 输出: [2. 0. 8.]
3.3 使用 np.savetxt()
保存数据
np.savetxt()
将数组保存为文本文件。
参数:
fname
:输出文件名。X
:要保存的数组(通常是二维)。fmt
:输出格式(如'%.2f'
表示保留两位小数)。delimiter
:分隔符,默认是空格。
示例:
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 保存为文本文件
np.savetxt('output.txt', data, fmt='%.1f', delimiter=',')
# 保存结果 (output.txt 内容):
# 1.0,2.0,3.0
# 4.0,5.0,6.0
# 7.0,8.0,9.0
4. 二进制文件操作
NumPy 提供了高效的二进制文件格式(.npy
和 .npz
),适合存储和加载大型数组,速度比文本文件快,且节省空间。
4.1 使用 np.save()
保存单个数组
np.save()
将单个数组保存为 .npy
文件。
示例:
data = np.array([[1, 2], [3, 4]])
np.save('data.npy', data)
4.2 使用 np.savez()
保存多个数组
np.savez()
将多个数组保存为压缩的 .npz
文件,适合存储多个相关数组。
示例:
data1 = np.array([1, 2, 3])
data2 = np.array([4, 5, 6])
np.savez('data.npz', array1=data1, array2=data2)
4.3 使用 np.load()
加载二进制文件
np.load()
从 .npy
或 .npz
文件加载数据。
加载 .npy
文件:
data = np.load('data.npy')
print(data)
# 输出:
# [[1 2]
# [3 4]]
加载 .npz
文件:
data = np.load('data.npz')
print(data['array1']) # 输出: [1 2 3]
print(data['array2']) # 输出: [4 5 6]
5. 高级功能
5.1 处理大文件
对于超大文件,建议:
- 使用二进制格式(
.npy
或.npz
)以提高读写速度。 - 使用
mmap_mode
参数(np.load()
支持)启用内存映射,避免一次性加载整个文件:
data = np.load('data.npy', mmap_mode='r') # 按需加载
5.2 与其他格式交互
- CSV 文件:复杂 CSV 文件建议使用
pandas.read_csv()
,然后转换为 NumPy 数组。 - MATLAB 文件:使用
scipy.io.loadmat()
和scipy.io.savemat()
处理.mat
文件。 - HDF5 文件:使用
h5py
库处理高性能 HDF5 格式。
示例(与 MATLAB 文件交互):
from scipy.io import savemat, loadmat
data = {'array': np.array([[1, 2], [3, 4]])}
savemat('data.mat', data)
loaded = loadmat('data.mat')
print(loaded['array'])
# 输出:
# [[1 2]
# [3 4]]
6. 注意事项
- 文本文件格式要求:
loadtxt
和genfromtxt
要求文件格式规整,列数一致。- 缺失值或不规则数据需用
genfromtxt
处理。
- 编码问题:
- 默认使用 UTF-8 编码,若文件使用其他编码(如 GBK),需指定
encoding
参数:python data = np.loadtxt('data.txt', encoding='latin1')
- 性能优化:
- 二进制文件(
.npy
、.npz
)比文本文件更快,适合大数据。 - 对于复杂数据结构,考虑
pandas
或h5py
。
- 数据类型:
- 读取时指定
dtype
以确保正确的数据类型。 - 保存时通过
fmt
控制输出精度。
7. 综合示例
假设有一个 CSV 文件 data.csv
:
x,y
1.0,2.0
3.0,4.0
5.0,6.0
读取、处理并保存:
import numpy as np
# 读取 CSV 文件
data = np.genfromtxt('data.csv', delimiter=',', names=True)
print(data) # 输出: [(1., 2.) (3., 4.) (5., 6.)]
# 提取列并进行计算
x = data['x']
y = data['y']
result = x + y
# 保存结果为二进制文件
np.save('result.npy', result)
# 保存为文本文件
np.savetxt('result.txt', result, fmt='%.2f', header='Sum of x and y')
生成的 result.txt
:
# Sum of x and y
3.00
7.00
11.00
8. 总结
- 文本文件:
np.loadtxt()
和np.genfromtxt()
用于读取,np.savetxt()
用于保存,适合简单数据。 - 二进制文件:
np.save()
、np.savez()
和np.load()
提供高效的存储和加载,适合大数据。 - 高级格式:复杂数据建议结合
pandas
或h5py
处理。 - 建议:优先使用二进制格式以提高性能,处理缺失值或复杂结构时使用
genfromtxt
或其他库。
如果需要更具体的 I/O 示例(如处理特定文件格式或优化大文件读写),请告诉我!