NumPy怎么从文件中读取数据?

文章导读
Previous Quiz Next NumPy 中的文件读取 从文件中读取数据涉及打开文件并提取其内容以供进一步使用。在 Python 中,NumPy 和 Pandas 等库提供了从各种文件格式(如文本、CSV 和二进制文件)加载数据的函数。这使得存储的信息可以轻松
📋 目录
  1. NumPy 中的文件读取
  2. 从文本文件读取数据
  3. 从二进制文件读取数据
  4. 使用 memmap() 函数的内存映射文件
  5. 处理 CSV 文件
A A

NumPy - 从文件中读取数据



Previous
Quiz
Next

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'。