NumPy - 从文件读取数据
NumPy 中的文件读取
从文件读取数据包括打开文件并提取其内容以供进一步使用。在 Python 中,NumPy 和 Pandas 等库提供了从各种文件格式(例如文本、CSV 和二进制)加载数据的函数。这使得我们可以轻松访问存储的信息进行分析或处理。
在 Python 中,文件可以分为多种类型,包括文本文件、CSV 文件和二进制文件。NumPy 可以轻松地将这些文件中的数据加载到数组中,然后用于分析或处理。
NumPy 提供了多个从文件读取数据的函数,使我们能够将数据加载到 NumPy 数组中以供进一步处理和分析。我们将介绍的主要函数包括:-
用于读取数据的 NumPy 函数
以下是 NumPy 中用于从文件读取数据的函数:-
- numpy.loadtxt(): 从文本文件中读取数据,其中值由空格、逗号或其他分隔符分隔。
- numpy.genfromtxt(): 与 loadtxt() 函数类似,但更灵活,允许您处理缺失值和不同的数据类型。
- numpy.load(): 从 .npy 或 .npz 文件读取二进制数据。
- numpy.memmap(): 高效地将大型二进制文件映射到内存,而无需将整个文件加载到内存中。
从文本中读取数据文件
文本文件简单且广泛用于存储数据。这些文件可能包含用空格、制表符或逗号分隔的数字数据。让我们探索如何使用 NumPy 从文本文件中读取数据。
使用 loadtxt() 函数读取简单文本文件
numpy.loadtxt() 函数用于读取简单、结构良好的文本文件。默认情况下,它假定文件中的数据为数字,并且可以自动使用空格或自定义分隔符分隔值。
示例:从文本文件中读取数据
在这里,我们创建了一个包含三行数字的文件。 numpy.loadtxt() 函数读取文件并返回一个二维数组,其中每一行对应文本文件中的一行 -
import numpy as np # 创建示例文本文件 with open('data.txt', 'w') as f: f.write("1 2 3 4 5 6 7 8 9 ") # 从文本文件读取数据 data = np.loadtxt('data.txt') print("从文本文件加载的数据:") print(data)
以下是得到的输出 -
从文本文件加载的数据: [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
使用 loadtxt() 函数自定义分隔符
如果您的数据由逗号、制表符或其他字符分隔,您也可以使用 numpy.loadtxt() 函数指定自定义分隔符。
示例
在此示例中,文件使用逗号作为分隔符,我们在 loadtxt() 函数中指定了 ',' 分隔符 -
import numpy as np # 创建类似 CSV 的文本文件 with open('data.csv', 'w') as f: f.write("1,2,3 4,5,6 7,8,9 ") # 以逗号作为分隔符加载数据 data = np.loadtxt('data.csv', delimiter=',') print("从 CSV 文件加载的数据:") print(data)
这将产生以下结果 -
从 CSV 文件加载的数据: [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
使用 genfromtxt() 函数处理缺失数据
有时,数据集包含缺失或不完整的值。 numpy.genfromtxt() 函数比 loadtxt() 函数更灵活,可以处理缺失数据或更复杂的文件结构。
示例:读取包含缺失值的数据
此处,第二行的缺失值被替换为 nan(非数字)。这在处理实际数据集中缺失数据很常见时非常有用 -
import numpy as np # 创建包含缺失值的文本文件 with open('data_with_missing.csv', 'w') as f: f.write("1,2,3 4,,6 7,8,9 ") # 加载数据,指定缺失值 data = np.genfromtxt('data_with_missing.csv', delimiter=',', filling_values=np.nan) print("加载后的缺失值数据:") print(data)
以下是上述代码的输出 -
加载后的缺失值数据: [[ 1. 2. 3.] [ 4. nan 6.] [ 7. 8. 9.]]
从二进制文件读取数据
二进制文件通常用于存储数据,因为它们在空间和速度方面更高效。NumPy 支持使用 numpy.load() 和 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("从二进制文件加载的数据:") print(loaded_data)
输出结果如下 -
从二进制文件加载的数据: [[1 2 3] [4 5 6] [7 8 9]]
使用 memmap() 函数的内存映射文件
为了处理内存无法容纳的大型数据集,NumPy 使用 numpy.memmap() 函数提供了内存映射数组。此函数允许您读取和写入大型二进制文件,而无需将整个文件加载到内存中。
示例:使用内存映射文件
内存映射非常适合大型数据集,因为它允许您直接访问文件的某些部分,而无需将整个文件加载到内存中 -
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("内存映射数据的前 10 个元素:") print(mmapped_data[:10])
执行上述代码后,我们得到以下输出 -
内存映射数据的前 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]
使用 CSV 文件
CSV(逗号分隔值)文件通常用于存储表格数据。NumPy 提供了读取和写入 CSV 文件的函数。 numpy.genfromtxt() 函数可以处理 CSV 文件,numpy.savetxt() 函数可用于将数据写入 CSV。
示例:将数据写入 CSV
在下面的示例中,我们创建一个二维 NumPy 数组,并使用 np.savetxt() 函数将其写入 CSV 文件。数据以逗号分隔符保存,并格式化为整数 -
import numpy as np # 创建二维数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 将数据写入 CSV 文件 np.savetxt('output.csv', data, delimiter=',', fmt='%d') print("数据已写入 'output.csv'.")
结果如下 -
数据已写入 'output.csv'.