NumPy - 将数据写入文件
使用 NumPy 将数据写入文件
将数据写入文件涉及将信息从程序保存到存储介质,例如文本文件、CSV 或二进制文件。此过程允许保存、共享和重用数据。
在本教程中,我们将探索使用 NumPy 将数据写入文件的各种方法,包括以文本和二进制格式保存数据、使用不同的分隔符以及处理大型数据集。
为什么将数据保存到文件?
我们将数据保存到文件的原因如下:
- 保存数据: 存储数据以供将来分析或记录。
- 共享数据: 以标准格式与他人共享数据。
- 效率: 通过保存中间结果或最终结果来避免重新计算结果。
- 备份: 创建重要数据的备份以防止数据丢失。
将数据写入文本文件
文本文件是一种常见的格式用于存储数据,因为它们易于阅读且易于共享。NumPy 提供了多个函数用于将数组写入文本文件。
使用 numpy.savetxt() 函数
numpy.savetxt 函数用于将 NumPy 数组写入文本文件。它允许自定义输出文件的分隔符、格式和标头信息。
示例
在下面的示例中,我们将创建一个示例二维 NumPy 数组,并使用 np.savetxt() 函数将其写入文本文件。数组的内容保存在文件"data.txt"中 -
import numpy as np # 创建示例 NumPy 数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 将数组写入文本文件 np.savetxt('data.txt', data) print("数据已写入"data.txt".")
以下是输出结果 -
数据已写入"data.txt"。
指定分隔符
您可以指定分隔符来分隔文本文件中的元素,以便稍后更轻松地解析数据。例如,设置 delimiter=',' 将使用逗号分隔值。
示例
在以下示例中,我们将创建一个二维 NumPy 数组,并使用 np.savetxt() 函数将其写入文本文件,并使用逗号分隔符 -
import numpy as np # 创建二维数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 将数组写入文本文件,并使用逗号分隔符 np.savetxt('data_comma.txt', data, delimiter=',') print("数据已写入 'data_comma.txt'.")
输出结果如下如下所示 -
数据已写入"data_comma.txt"。
格式化数据
您还可以使用 fmt 参数格式化数据。当您想要控制数据的外观(例如小数位数、列宽或每个元素的特定格式)时,此功能非常有用。
示例
在此示例中,我们创建一个二维 NumPy 数组,并使用 np.savetxt() 将其与格式化数据一起写入文本文件。数组元素保存在文件"data_formatted.txt"中,保留两位小数 -
import numpy as np # 创建二维数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 将数组写入格式化数据的文本文件 np.savetxt('data_formatted.txt', data, fmt='%0.2f') print("数据已写入"data_formatted.txt".")
执行上述代码后,我们得到以下输出 -
数据已写入"data_formatted.txt"。
将数据写入 CSV 文件
CSV(逗号分隔值)文件是存储表格数据的常用格式。虽然 numpy.savetxt() 函数可以通过指定逗号分隔符来写入 CSV 文件,但 numpy.genfromtxt() 函数更适用于将 CSV 文件读回 NumPy 数组。
示例:使用 numpy.savetxt() 函数
在下面的示例中,我们创建一个二维 NumPy 数组,并使用 np.savetxt() 函数(以逗号分隔符)将其写入 CSV 文件 -
import numpy as np # 创建二维数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 将数组写入 CSV 文件文件 np.savetxt('data.csv', data, delimiter=',') print("数据已写入 'data.csv'.")
结果如下:-
数据已写入 'data.csv'.
示例:使用 numpy.genfromtxt() 函数
在下面的示例中,我们将创建一个二维 NumPy 数组并将其保存到 CSV 文件。然后,我们使用 np.genfromtxt() 函数将 CSV 文件读回 NumPy 数组 -
import numpy as np # 创建二维数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 将 CSV 文件读回 NumPy 数组 data_from_csv = np.genfromtxt('data.csv', delimiter=',') print( data_from_csv)
我们得到如下所示的输出 -
[[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
将数据写入二进制文件
二进制文件更适合存储大型数据集,因为它们占用更少的空间,并且读写速度更快。NumPy 提供了将数组写入 .npy 和 .npz 格式的二进制文件的函数。
使用 numpy.save() 函数
numpy.save 函数用于将单个 NumPy 数组写入 .npy 格式的二进制文件。这种格式非常紧凑,并且保留了数组的数据类型和结构。
示例
在此示例中,numpy.save() 函数将数组写入二进制 .npy 文件,然后 numpy.load() 函数将其加载回来 -
import numpy as np # 创建二维数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 将数组保存到二进制文件 np.save('data.npy', data) # 从二进制文件加载数据 loaded_data = np.load('data.npy') print("从二进制文件加载的数据file:") print(loaded_data)
以下是得到的输出 −
从二进制文件加载的数据: [[1 2 3] [4 5 6] [7 8 9]]
使用 numpy.savez() 函数
numpy.savez 函数用于将多个数组写入压缩的 .npz 文件。 它允许您高效地存储和检索具有自定义名称的多个数组。
示例
在下面的示例中,我们将创建两个 NumPy 数组,并使用 np.savez() 函数将它们保存到一个 .npz 文件中,这两个数组分别存储在自定义名称"array1"和"array2"下 −
import numpy as np # 创建数组 array1 = np.array([1, 2, 3]) array2 = np.array([[4, 5, 6], [7, 8, 9]]) # 将数组保存到 NPZ 文件 np.savez('data.npz', array1=array1, array2=array2) print("数组已保存到 'data.npz'.")
这将产生以下结果 -
数组已保存到 'data.npz'.
使用 numpy.load() 函数
numpy.load() 函数从二进制文件(通常为 .npy 或 .npz 格式)加载 NumPy 数组。它允许您恢复已保存的数组并访问其数据以进行进一步处理。
示例
在以下示例中,我们使用 np.load() 函数从 data.npz 文件加载数组,并通过自定义名称"array1"和"array2"访问它们 -
import numpy as np # 从 NPZ 文件加载数组 data = np.load('data.npz') # 访问并打印数组 print("Loaded array1:") print(data['array1']) print("Loaded array2:") print(data['array2'])
以下是上述代码的输出 -
Loaded array1: [1 2 3] 已加载数组2: [[4 5 6] [7 8 9]]
处理大型数据集
处理大型数据集时,可能会遇到内存限制。为了处理这种情况,NumPy 提供了多种方法,包括使用内存映射文件。
内存映射文件允许您访问存储在磁盘上的大型文件的一小部分,而无需将整个文件一次性加载到内存中。这种方法在处理大型数据集时可以更高效地管理内存。
示例
在以下示例中,我们创建一个内存映射文件来存储一个大型数组,向其中写入数据,然后读取数据,而无需一次性将整个文件加载到内存中 -
import numpy as np # 创建一个内存映射文件来存储一个大型数组 large_array = np.memmap('large_data.dat', dtype='float32', mode='w+', shape=(10000, 10000)) # 将随机数据写入内存映射文件 large_array[:] = np.random.rand(10000, 10000) # 从内存映射文件中访问数据 large_array_read = np.memmap('large_data.dat', dtype='float32', mode='r', shape=(10000, 10000)) # 打印从内存映射文件读取的数组形状 print("内存映射数组的形状:", large_array_read.shape)
输出结果如下:-
内存映射数组的形状:(10000, 10000)
编写自定义数据格式
在许多情况下,处理数据需要将其保存为特定格式,该格式会根据您正在使用的应用程序或系统的需求进行更改。
NumPy 提供了 numpy.ndarray.tofile() 函数和 numpy.fromfile()用于编写自定义数据格式的函数,允许您定义数据的存储和检索方式。
使用 numpy.ndarray.tofile() 函数
numpy.ndarray.tofile() 函数用于将 NumPy 数组的内容写入二进制文件。它允许您指定文件名和数据存储格式。
此函数可用于将大型数组保存为二进制格式,以实现高效的存储和检索。
示例
在下面的示例中,我们将创建一个包含整数值的简单 NumPy 数组,并使用 tofile() 函数将其写入二进制文件 -
import numpy as np # 创建一个示例 NumPy 数组 data = np.array([1, 2, 3, 4, 5], dtype='int32') # 将数组写入二进制文件 data.tofile('data_binary.dat') print("数组已写入二进制文件:", data)
结果如下 -
数组已写入二进制文件:[1 2 3 4 5]
使用 numpy.fromfile() 函数
numpy.fromfile 函数用于从文件读取二进制数据并将其加载到 NumPy 数组中。它允许您指定要读取的数组的数据类型 (dtype) 和形状。
此方法通常用于加载以二进制格式存储的大型数据集。
示例
在此示例中,我们将二进制文件"data_binary.dat"读入指定数据类型为"int32"的 NumPy 数组。由于二进制文件包含 5 个元素,我们将它们加载到一维数组中,而无需对其进行整形 -
import numpy as np # 从二进制文件中读取数组并对其进行整形以匹配可用数据 data_from_binary = np.fromfile('data_binary.dat', dtype='int32') # 打印加载的数组(由于元素数量不匹配,因此无需进行整形) print("从二进制文件读取的数组:", data_from_binary)
我们得到如下所示的输出 -
从二进制文件读取的数组:[1 2 3 4 5]