NumPy - 加载数组
在 NumPy 中加载数组
NumPy 加载数组是指从外部文件或源读取数据并将其加载到 NumPy 数组中的过程。
此功能允许您处理存储在文本文件、二进制文件或其他格式文件中的数据,并将这些数据带入 NumPy 环境进行分析或操作。以下是 NumPy 中加载数组的常用方法 -
- 从文本文件加载: 使用 np.loadtxt() 或 np.genfromtxt() 等函数从文本文件读取数据。
- 从二进制文件加载: 使用 np.fromfile() 函数从二进制文件读取数据。
- 从 .npy 文件加载: 使用 np.load() 函数从以 NumPy 原生二进制格式保存的文件(.npy 文件)读取数据。
从文本文件加载数组
在 NumPy 中,从文本文件加载数组是将纯文本文件中存储的数据导入 NumPy 数组的常用操作。
NumPy 提供了 np.loadtxt() 函数和np.genfromtxt() 函数用于处理不同的文本文件格式和结构,从而轻松处理各种类型的文本数据,它们是:-
使用 np.loadtxt() 函数
np.loadtxt() 函数用于将数据从文本文件读取到 NumPy 数组中。
此函数通常用于加载以表格格式组织的结构化数据,例如 CSV 文件或空格分隔的文件。它适用于每行包含一行数字且所有行具有相同列数的数据文件。语法如下:
numpy.loadtxt(fname, dtype=<type>, delimiter=<delimiter>, comments=<char>, skiprows=<num>, usecols=<cols>)
其中,
- fname: 要读取的文件名或文件对象。
- dtype: 结果数组的数据类型(默认为浮点型)。
- delimiter: 用于分隔值的字符串或字符(例如,逗号、空格)。
- comments: 表示注释开头的字符串(例如,#)。
- skiprows: 文件开头跳过的行数。
- usecols: 要读取的列的索引(例如,[0, 2] 表示读取第一列和第三列)。
示例
假设您有一个文本文件"data.txt",其中包含以下内容 -
1 2 3 4 5 6 7 8 9
您可以使用 loadtxt() 函数将此数据加载到 NumPy 数组中,如下所示 -
import numpy as np # 从文本文件加载数据 array_from_text = np.loadtxt('data.txt') print("从文本文件加载数组:") print(array_from_text)
使用 np.genfromtxt() 函数
np.genfromtxt() 函数用于将文本文件中的数据读入 NumPy 数组。它对于处理更复杂的文本文件格式非常有用,包括包含缺失值、混合数据类型和不规则结构的文件。语法如下:
numpy.genfromtxt(fname, dtype=<type>, delimiter=<delimiter>, comments=<char>, skip_header=<num>, usecols=<cols>, filling_values=<value>, missing_values=<value>, converters=<dict>, encoding=<str>, names=<bool>)
其中:
- fname: 要读取的文件名或文件对象。
- dtype: 结果数组的数据类型。如果未指定,则默认为浮点型。
- delimiter: 分隔值的字符串或字符(例如,CSV 使用逗号,空格使用空格)。
- comments: 表示注释开始的字符串(例如 #)。以此字符开头的行将被忽略。
- skip_header: 文件开头要跳过的行数(用于跳过文件头)。
- usecols: 要读取的列的索引。例如,[0, 2] 将仅读取第一列和第三列。
- filling_values: 用于表示缺失数据的值。可以是标量或将列索引映射到填充值的字典。
- missing_values: 表示文件中缺失数据的值。可以是标量或值列表。
- converters: 用于将列转换为特定格式的函数字典。
- encoding: 用于读取文件的编码(默认值为 None,即使用系统默认值)。
- names: 如果为 True,则假定文件的第一行包含列名。
示例
在此示例中,我们使用 genfromtxt() 函数将"data.txt"文件加载到 NumPy 数组中 -
import numpy as np # 从文本文件加载数据 array = np.genfromtxt('data.txt') print("从文本文件加载的数组file:") print(array)
从二进制文件加载数组
在 NumPy 中,从二进制文件加载数组涉及读取以二进制格式存储的数据,这种格式通常比文本格式更高效地存储和检索数据。
二进制文件包含原始数据,必须根据预期的格式和数据类型正确解释这些数据。NumPy 提供了 np.fromfile() 函数和 np.load() 函数来从二进制文件加载数组。
使用 np.fromfile() 函数
np.fromfile() 函数用于将文件中的二进制数据加载到 NumPy 数组中。此函数需要了解二进制文件的数据类型和格式。语法如下:
numpy.fromfile(file, dtype=<type>, count=-1, offset=0)
其中:
- file: 要读取的文件名或文件对象。
- dtype: 结果数组的数据类型(例如,np.float32、np.int32)。
- count: 要读取的项目数。如果为 -1,则读取所有数据。
- 偏移量: 文件开头要跳过的字节数。
示例
假设您有一个包含"32 位"浮点数据的二进制文件"data.bin"。该文件可以使用以下代码创建 -
import numpy as np # 创建一个包含浮点数据的二进制文件 data = np.array([1.1, 2.2, 3.3], dtype=np.float32) data.tofile('data.bin') print ('文件已创建!')
现在,要读取此二进制文件,请使用以下代码 -
import numpy as np # 从二进制文件加载数据 array = np.fromfile('data.bin', dtype=np.float32) print("从二进制文件加载的数组:") print(array)
以下是上述代码的输出 -
从二进制文件加载的数组: [1.1 2.2 3.3]
使用.npy 文件的 np.load() 函数
NumPy 中的 np.load() 函数用于从 NumPy 原生二进制格式 .npy 或 .npz 的文件中加载数组或数据。此格式保留了数组的元数据,例如其形状和数据类型。".npz"格式用于以压缩格式存储多个数组。
语法如下:
numpy.load(file, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding='ASCII')
其中:
- file: 要读取的文件名或文件对象。这可以是 .npy 文件(用于单个数组)或 .npz 文件(用于多个数组)。
- mmap_mode: 如果不为 None,则用于对文件进行内存映射,这样就可以读取大型数组而无需将整个文件加载到内存中。有效值为 'r'、'r+'、'w+' 等。
- allow_pickle: 如果为 True,则允许加载以 Python pickle 格式保存的对象。请谨慎使用此选项,因为它可能执行任意代码并带来安全风险。
- fix_imports: 如果为 True,则在加载 pickled 数据时尝试检测并修复 Python 2 到 Python 3 的兼容性问题。
- encoding: 加载 Python 3 文件时用于解码 Python 2 字符串数据的编码。默认值为 'ASCII'。
示例:加载 .npy 文件
这里,我们首先将一个数组保存为".npy"文件格式 -
import numpy as np # 创建一个 NumPy 数组 array = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32) # 将数组保存到 .npy 文件 np.save('data.npy', array) print ("Saved!!")
现在,我们使用 NumPy 中的 load() 函数从".npy"文件加载已保存的数组 -
import numpy as np # 从 .npy 文件加载数组 array = np.load('data.npy') print("从 .npy 文件加载的数组:") print(array)
输出结果如下 -
从 .npy 文件加载的数组: [[1 2 3] [4 5 6]]
示例:加载 .npz 文件
.npz 格式用于将多个数组保存到一个压缩文件中。它会创建一个 zip 压缩包,其中每个文件都是一个".npy"文件,如下例所示 -
import numpy as np # 将多个数组保存到 .npz 文件 array1 = np.array([1, 2, 3]) array2 = np.array([[4, 5, 6], [7, 8, 9]]) np.savez('data.npz', array1=array1, array2=array2) # 从 .npz 文件加载数组 data = np.load('data.npz') # 使用键访问各个数组 array1_loaded = data['array1'] array2_loaded = data['array2'] print("数组 1 已从.npz 文件:") print(array1_loaded) print("数组 2 已从 .npz 文件加载:") print(array2_loaded)
执行上述代码后,我们得到以下输出 -
数组 1 已从 .npz 文件加载: [1 2 3] 数组 2 已从 .npz 文件加载: [[4 5 6] [7 8 9]]