趋近智
将NumPy数组保存到磁盘是处理数值数据时的一项主要任务,以便后续使用、共享或作为大型数据处理流程的一部分。反之,将文件中的现有数据加载到NumPy数组中也同样需要。NumPy为这些输入/输出(I/O)操作提供了直接且高效的函数,支持简单的文本格式和优化的二进制格式。
文本文件,例如逗号分隔值(CSV),人类可读,易于在不同应用间共享。NumPy提供了与这些格式交互的函数。
np.savetxt() 函数将NumPy数组保存到文本文件。它的基本用法需要文件名和要保存的数组。
import numpy as np
# 创建一个示例二维数组
data_array = np.arange(12, dtype=np.float32).reshape(3, 4)
print("原始数组:")
print(data_array)
# 将数组保存到文本文件(例如CSV)
np.savetxt('data_array.csv', data_array, delimiter=',')
print("\n数组已保存到 data_array.csv")
默认情况下,np.savetxt() 使用空格作为分隔符。我们指定了 delimiter=',' 来创建一个标准CSV文件。您还可以使用 fmt 参数控制数字的输出格式。例如,fmt='%.4f' 会将浮点数保存为带4位小数的格式。
要从文本文件加载数据到NumPy数组,请使用 np.loadtxt()。您需要提供文件名,并且通常需要提供文件中使用的分隔符。
# 从文本文件加载数组
loaded_array_text = np.loadtxt('data_array.csv', delimiter=',')
print("\n从 data_array.csv 加载的数组:")
print(loaded_array_text)
print("数据类型:", loaded_array_text.dtype)
请注意,np.loadtxt() 默认假定所有数据都可以转换为浮点数。如果数据包含不同类型或有标题行,您可能需要使用更高级的选项(例如 dtype 或 skiprows 参数),或者考虑使用 Pandas 进行更灵活的文本文件解析,我们将在下一章介绍。
文本文件便于检查和共享,但在存储空间和I/O速度方面效率不高,尤其是对于大型数组。它们通常也仅限于保存一维和二维数组。
为了高效存储和更快的I/O,尤其是在基于Python的工作流程中,NumPy的原生二进制格式(.npy)是更推荐的选择。
np.save() 函数将单个NumPy数组保存到带有 .npy 扩展名的二进制文件。这种格式可以精确地保存数组的形状、数据类型和内容。
# 创建另一个示例数组
array_to_save = np.linspace(0, 1, 10).reshape(2, 5)
print("\n要保存为二进制格式的数组:")
print(array_to_save)
# 将数组保存到 .npy 文件
np.save('single_array.npy', array_to_save)
print("\n数组已保存到 single_array.npy")
生成的 .npy 文件不可读,但针对NumPy进行了高度优化。
使用 np.load() 从 .npy 文件加载数组。NumPy自动处理元数据(形状、数据类型)和数据本身的读取。
# 从 .npy 文件加载数组
loaded_array_binary = np.load('single_array.npy')
print("\n从 single_array.npy 加载的数组:")
print(loaded_array_binary)
print("数据类型:", loaded_array_binary.dtype)
print("形状:", loaded_array_binary.shape)
如果需要将多个数组保存到一个文件,np.savez() 是合适的工具。它将数组保存到带有 .npz 扩展名的未压缩归档文件。您将数组作为关键字参数提供,这些关键字将用作以后检索数组的键。
# 创建多个数组
array_a = np.array([1, 2, 3, 4])
array_b = np.random.rand(2, 3) # 一个2x3的随机数数组
print("\n将多个数组 (array_a, array_b) 保存到 arrays.npz")
# 将多个数组保存到 .npz 归档文件
np.savez('arrays.npz', first_array=array_a, second_array=array_b)
从 .npz 文件加载数据也使用 np.load()。它返回一个 NpzFile 对象,该对象行为类似于字典。您可以使用保存时提供的键访问单个数组。
# 加载 .npz 归档文件
loaded_data = np.load('arrays.npz')
print("\n从 arrays.npz 加载的数组:")
# 使用键访问单个数组
loaded_a = loaded_data['first_array']
loaded_b = loaded_data['second_array']
print("已加载 'first_array':")
print(loaded_a)
print("\n已加载 'second_array':")
print(loaded_b)
# 可以列出键(数组名称)
print("\n归档中的键:", loaded_data.files)
# 重要:完成后关闭文件句柄
loaded_data.close()
最佳实践是在使用完加载的 NpzFile 对象后调用 .close(),或者使用 with 语句进行自动处理:
with np.load('arrays.npz') as data:
arr1 = data['first_array']
arr2 = data['second_array']
print("\n在 'with' 语句中加载 - arr1 形状:", arr1.shape)
如果文件大小是一个重要考虑因素,可以使用 np.savez_compressed()。它的工作方式与 np.savez() 相同,但使用 zipfile 压缩输出的 .npz 文件。这会生成更小的文件,但保存和加载所需时间更长。
# 将多个数组保存到压缩的 .npz 归档文件
np.savez_compressed('arrays_compressed.npz', first_array=array_a, second_array=array_b)
print("\n数组已保存到压缩文件: arrays_compressed.npz")
# 加载方式与 np.savez 相同
with np.load('arrays_compressed.npz') as data_comp:
loaded_a_comp = data_comp['first_array']
print("\n从压缩文件加载的 'first_array':", loaded_a_comp)
np.savetxt() / np.loadtxt() 的时机:
np.save() / np.load() 的时机:
np.savez() / np.savez_compressed() 的时机:
能够高效地持久化和重新加载数值数据在机器学习中是基本的。无论是保存处理过的数据集、中间计算结果,还是训练过程中学到的模型参数(例如权重和偏置),这些NumPy I/O函数都提供了必要的工具。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造