NumPy - 从文件中读取数据
NumPy 中的文件读取
从文件中读取数据涉及打开文件并提取其内容以供进一步使用。在 Python 中,NumPy 和 Pandas 等库提供了从各种文件格式(如文本、CSV 和二进制文件)加载数据的函数。这使得存储的信息可以轻松访问,用于分析或处理。
在 Python 中,文件可以有多种类型,包括文本文件、CSV 文件和二进制文件。NumPy 使得从这些文件中加载数据到数组变得简单,这些数组随后可用于分析或处理。
NumPy 提供了几个函数来从文件中读取数据,使我们能够将数据加载到 NumPy arrays 中进行进一步的处理和分析。我们将介绍的主要函数是 −
用于读取数据的 NumPy 函数
以下是在 NumPy 中用于从文件读取数据的函数 −
- numpy.loadtxt(): 从文本文件中读取数据,其中值由空格、逗号或其他分隔符分隔。
- numpy.genfromtxt(): 类似于 loadtxt() 函数,但更灵活,允许处理缺失值和不同数据类型。
- numpy.load(): 从 .npy 或 .npz 文件中读取二进制数据。
- numpy.memmap(): 高效地将大型二进制文件映射到内存,而无需将整个文件加载到内存中。
从文本文件读取数据
文本文件简单且广泛用于存储数据。这些文件可能包含用空格、制表符或逗号分隔的数值数据。让我们探索如何使用 NumPy 从文本文件读取数据。
使用 loadtxt() 函数读取简单文本文件
numpy.loadtxt() 函数用于读取简单、结构良好的文本文件。默认情况下,它假定文件中的数据为数值型,并能自动按空白字符或自定义分隔符拆分值。
示例:从文本文件读取数据
在这里,我们创建了一个包含三行数字的文件。numpy.loadtxt() 函数读取该文件并返回一个 2D array,其中每一行对应文本文件中的一行 −
import numpy as np
# 创建一个示例文本文件
with open('data.txt', 'w') as f:
f.write("1 2 3\n4 5 6\n7 8 9\n")
# 从文本文件读取数据
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\n4,5,6\n7,8,9\n")
# 使用逗号作为分隔符加载数据
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(Not a Number)。这在处理真实世界数据集中常见的缺失数据时非常有用 −
import numpy as np
# 创建一个包含缺失值的文本文件
with open('data_with_missing.csv', 'w') as f:
f.write("1,2,3\n4,,6\n7,8,9\n")
# 加载数据,指定缺失值
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() 函数读取和写入二进制文件。这些函数针对以 .npy 扩展名的二进制格式存储 NumPy array 进行了优化。
示例
在这个示例中,numpy.save() 函数将 array 写入二进制 .npy 文件,numpy.load() 函数将其加载回来。这种格式紧凑且保留了 array 的数据类型和结构 −
import numpy as np
# 创建一个示例 array
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 将 array 保存到二进制文件
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(Comma-Separated Values,逗号分隔值)文件常用于存储表格数据。NumPy 提供了读写 CSV 文件的函数。numpy.genfromtxt() 函数可以处理 CSV 文件,而 numpy.savetxt() 函数可用于将数据写入 CSV。
示例:将数据写入 CSV
在以下示例中,我们创建一个 2D NumPy 数组,并使用 np.savetxt() 函数将其写入 CSV 文件。数据以逗号分隔符保存,并格式化为整数 −
import numpy as np
# 创建一个 2D 数组
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'。