将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速度方面效率不高,尤其是对于大型数组。它们通常也仅限于保存一维和二维数组。保存和加载NumPy二进制格式数据为了高效存储和更快的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() 的时机:需要人类可读文件时(例如CSV)。需要与不理解NumPy二进制格式的应用程序共享数据时。数组相对较小,且性能不是主要考虑时。仅处理一维或二维数组时。使用 np.save() / np.load() 的时机:需要高效保存和加载单个NumPy数组时。性能和存储空间是重要考量时。在Python/NumPy环境中使用时。需要精确保留数据类型和形状(包括更高维度)时。使用 np.savez() / np.savez_compressed() 的时机:需要将多个数组存储到单个文件时。如果磁盘空间比I/O速度更重要,请使用压缩版本。能够高效地持久化和重新加载数值数据在机器学习中是基本的。无论是保存处理过的数据集、中间计算结果,还是训练过程中学到的模型参数(例如权重和偏置),这些NumPy I/O函数都提供了必要的工具。