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:数据类型(如 floatint),默认 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=',')

处理复杂文件
如果文件包含标题或注释,可以用 skiprowscomments 参数:

# 假设 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. 注意事项

  1. 文本文件格式要求
  • loadtxtgenfromtxt 要求文件格式规整,列数一致。
  • 缺失值或不规则数据需用 genfromtxt 处理。
  1. 编码问题
  • 默认使用 UTF-8 编码,若文件使用其他编码(如 GBK),需指定 encoding 参数:
    python data = np.loadtxt('data.txt', encoding='latin1')
  1. 性能优化
  • 二进制文件(.npy.npz)比文本文件更快,适合大数据。
  • 对于复杂数据结构,考虑 pandash5py
  1. 数据类型
  • 读取时指定 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() 提供高效的存储和加载,适合大数据。
  • 高级格式:复杂数据建议结合 pandash5py 处理。
  • 建议:优先使用二进制格式以提高性能,处理缺失值或复杂结构时使用 genfromtxt 或其他库。

如果需要更具体的 I/O 示例(如处理特定文件格式或优化大文件读写),请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注