NumPy 的 I/O 操作
NumPy 的 I/O 操作
NumPy 中的 I/O 指的是输入/输出操作,允许你将数组保存到文件或从文件中加载数组。np.save() 和 np.load() 等函数处理二进制文件,而 np.savetxt() 和 np.loadtxt() 则处理文本文件。
文本文件的读写
文本文件是存储数据的最常用方式之一。NumPy 提供了读写文本文件的函数。这些操作的主要函数是 numpy.loadtxt() 和 numpy.savetxt()。
numpy.loadtxt() 函数
numpy.loadtxt() 函数将文本文件中的数据加载到 NumPy 数组中。它可以处理不同的数据类型,并允许自定义分隔符和跳过标题行。
示例:读取文本文件
在以下示例中,我们使用 np.loadtxt() 函数从 NumPy 中的文本文件加载数据 -
import numpy as np # 创建示例文本文件 with open('data.txt', 'w') as f: f.write("1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0") # 从文本文件加载数据 data = np.loadtxt('data.txt') print("从文本文件加载的数据:") print(data)
以下是得到的输出 -
从文本文件加载的数据: [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
numpy.savetxt() 函数
numpy.savetxt() 函数将 NumPy 数组保存到文本文件。它允许自定义输出文件的分隔符、格式和标头信息。
示例:写入文本文件
在本例中,我们使用 np.savetxt() 函数将 NumPy 数组保存到文本文件 -
import numpy as np # 创建数组 data = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) # 将数组保存到文本文件 np.savetxt('output.txt', data, delimiter=' ', fmt='%1.1f') print("数据已保存到文本文件'output.txt'")
数据以空格作为分隔符,小数点后一位保存到文件 'output.txt' 中 -
数据已保存到文本文件 'output.txt'
读取和写入二进制文件
二进制文件存储大型数据集更高效,因为与文本文件相比,它们更紧凑,读写速度更快。NumPy 提供了 numpy.save() 函数和 numpy.load() 函数用于二进制 I/O 操作。
numpy.save() 函数
numpy.save() 函数将 NumPy 数组保存为 .npy 格式的二进制文件。此函数保留数组的数据、形状和数据类型,以便高效存储和检索。
示例:写入二进制文件
在下面的示例中,我们使用 np.save() 函数将 NumPy 数组保存到二进制文件 -
import numpy as np # 创建数组 data = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) # 将数组保存到二进制文件 np.save('data.npy', data) print("数据已保存到二进制文件 'data.npy'")
以下是上述代码的输出−
数据已保存到二进制文件"data.npy"
numpy.load() 函数
numpy.load() 函数可从以 .npy 或 .npz 格式保存的二进制文件中加载数组。它可以高效地恢复已保存的数据,包括其形状和数据类型。
示例:读取二进制文件
在本例中,我们使用 np.load() 函数从 NumPy 中的二进制文件加载数组 −
import numpy as np # 从二进制文件加载数组 data = np.load('data.npy') print("从二进制文件加载的数据:") print(data)
输出结果如下 -
从二进制文件加载的数据: [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
处理 CSV 文件
逗号分隔值 (CSV) 文件广泛用于数据存储和交换。 NumPy 可以使用 numpy.genfromtxt() 和 numpy.savetxt() 函数读取和写入 CSV 文件。
numpy.genfromtxt() 函数
numpy.genfromtxt() 函数从文本文件加载数据,处理缺失值和非数字数据。它比 loadtxt() 函数更灵活,允许进行高级自定义,例如填充缺失值和指定数据类型。
示例:读取 CSV 文件
在下面的示例中,我们将创建一个包含示例数据的 CSV 文件并保存它。然后,我们使用 np.genfromtxt() 将 CSV 文件中的数据加载到 NumPy 数组中并打印出来 -
import numpy as np # 创建示例 CSV 文件 with open('data.csv', 'w') as f: f.write("1.0,2.0,3.0 4.0,5.0,6.0 7.0,8.0,9.0") # 从 CSV 文件加载数据 data = np.genfromtxt('data.csv', delimiter=',') print("从 CSV 文件加载的数据:") print(data)
执行上述代码后,我们得到以下输出 -
从 CSV 文件加载的数据: [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
示例:写入 CSV 文件
在此示例中,我们创建一个 NumPy 数组,并使用 np.savetxt() 将其保存到 CSV 文件中。数据以逗号分隔符保存,并格式化为小数点后一位 -
import numpy as np # 创建数组 data = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) # 将数组保存到 CSV 文件 np.savetxt('output.csv', data, delimiter=',', fmt='%1.1f') print("数据已保存到 CSV 文件 'output.csv'")
我们得到如下所示的输出 -
数据已保存到 CSV 文件 'output.csv'
使用NumPy 的 NPZ 文件
NumPy 的 NPZ 格式允许您将多个数组保存在一个文件中,从而方便地将相关数据存储在一起。您可以使用 numpy.savez() 和 numpy.load() 函数执行这些操作。
numpy.savez() 函数
numpy.savez() 函数将多个 NumPy 数组保存到一个压缩的 .npz 文件中。它允许您使用自定义名称存储多个数组,并在以后高效地检索它们。
示例:写入 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("数组已保存到 NPZ 文件 'data.npz'")
以下是输出结果 −
数组已保存到 NPZ 文件 'data.npz'
示例:从 NPZ 文件读取
在本例中,我们使用 np.load() 函数加载存储在 .npz 文件中的数组。我们通过引用加载文件中的名称来访问并打印数组"array1"和"array2" -
import numpy as np # 从 NPZ 文件加载数组 data = np.load('data.npz') print("从 NPZ 文件加载的数组 1:") print(data['array1']) print("从 NPZ 文件加载的数组 2:") print(data['array2'])
结果如下 -
从 NPZ 文件加载的数组 1: [1 2 3] 从 NPZ 文件加载的数组 2: [[4 5 6] [7 8 9]]
使用内存处理大型数据集映射
内存映射允许您通过将文件映射到内存来处理无法放入内存的大型数据集。NumPy 提供了 numpy.memmap() 函数来实现此目的。
示例:使用内存映射
在下面的示例中,我们将创建一个大型 NumPy 数组,并使用 np.save() 函数将其保存到二进制文件中。然后我们使用 np.memmap() 函数对文件进行内存映射,这样我们就可以访问大数据,而无需将其完全加载到内存中,并打印前 10 个元素 -
import numpy as np # 创建一个大数组并将其保存到二进制文件 data = np.arange(1e7) np.save('large_data.npy', data) # 对二进制文件进行内存映射 mmapped_data = np.memmap('large_data.npy', dtype='float64', mode='r', shape=(int(1e7),)) print("内存映射数据:") print(mmapped_data[:10])
上述代码的输出如下所示 -
内存映射数据: [1.87585069e-309 1.17119999e+171 5.22741680e-037 8.44740097e+252 2.65141232e+180 9.92152605e+247 2.16209968e+233 1.39837001e-076 5.89250072e-096 6.01347002e-154]