3.3 从文件读取数据创建数组 (简要介绍,文件操作可单独章节) 第三章:ndarray 的创建 3.3 从文件读取数据创建数组 NumPy 提供了强大的工具,可以从各种文件格式中读取数据,并将其直接转换为 ndarray 对象。这对于处理大量数据,尤其是科学计算和数据分析任务至关重要。本节将重点介绍两种常用的方法: 和 。文件操作本身比较复杂,可以单独作为一个章节来详细介绍,这里我们假设文件已经存在并且可以访问。 3.3.1 概述 从文件读取数据创建数组的主要目的是将存储在外部文件(如文本文件、CSV 文件等)中的数据导入到 NumPy 的 ndarray 中,以便进行后续的数值计算、分析和处理。NumPy 提供了多种函数来实现这个目的,其中最常用的是 和 。
NumPy 提供了强大的工具,可以从各种文件格式中读取数据,并将其直接转换为 ndarray 对象。这对于处理大量数据,尤其是科学计算和数据分析任务至关重要。本节将重点介绍两种常用的方法:numpy.loadtxt() 和 numpy.genfromtxt()。文件操作本身比较复杂,可以单独作为一个章节来详细介绍,这里我们假设文件已经存在并且可以访问。
3.3.1 概述
从文件读取数据创建数组的主要目的是将存储在外部文件(如文本文件、CSV 文件等)中的数据导入到 NumPy 的 ndarray 中,以便进行后续的数值计算、分析和处理。NumPy 提供了多种函数来实现这个目的,其中最常用的是 loadtxt 和 genfromtxt。
numpy.loadtxt(): 适用于读取结构化的、格式一致的文本文件。它假设文件中的每一行都包含相同数量的数据,并且数据类型可以统一转换。如果数据格式不规则或包含缺失值,loadtxt 可能会出错。
numpy.genfromtxt(): 更为通用,可以处理包含缺失值、不同数据类型以及更复杂格式的文件。它提供了更多的选项来处理缺失数据、指定数据类型和跳过特定行。
3.3.2 numpy.loadtxt()
numpy.loadtxt() 函数用于从文本文件加载数据并创建数组。
语法:
numpy.loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)
参数解释:
fname: 文件名、文件路径或类似文件的对象。
dtype: 数据类型。默认值为 float。
comments: 指定注释字符,默认值为 #。以该字符开头的行将被忽略。
delimiter: 分隔符。默认值为任何空白字符。
converters: 一个字典,用于将特定列的数据转换为特定类型。
skiprows: 跳过开头的行数。
usecols: 指定要读取的列的索引。
unpack: 如果为 True,则返回解包后的数组。
ndmin: 返回数组的最小维度。
encoding: 指定文件的编码方式。
max_rows: 读取的最大行数。
代码实践:
假设我们有一个名为 data.txt 的文件,内容如下:
1, 2, 3 4, 5, 6 7, 8, 9
示例 1:基本用法
import numpy as np data = np.loadtxt('data.txt', delimiter=',') print(data) print(data.dtype)
输出:
[[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]] float64
示例 2:指定数据类型和跳过行
假设我们有一个名为 data_with_header.txt 的文件,内容如下:
# This is a header # Column1, Column2, Column3 1, 2, 3 4, 5, 6 7, 8, 9
import numpy as np data = np.loadtxt('data_with_header.txt', delimiter=',', skiprows=2, dtype=int) print(data) print(data.dtype)
输出:
[[1 2 3] [4 5 6] [7 8 9]] int64
示例 3:使用 usecols
import numpy as np data = np.loadtxt('data.txt', delimiter=',', usecols=(0, 2)) print(data)
输出:
[[1. 3.] [4. 6.] [7. 9.]]
3.3.3 numpy.genfromtxt()
numpy.genfromtxt() 函数是 loadtxt() 的更强大的替代品,它可以处理更复杂的文件格式,包括包含缺失值的文件。
语法:
numpy.genfromtxt(fname, dtype=float, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
参数解释 (部分常用参数):
fname: 文件名、文件路径或类似文件的对象。
dtype: 数据类型。可以是一个类型或一个类型列表。
comments: 指定注释字符,默认值为 #。
delimiter: 分隔符。默认值为 None (任何空白字符)。
skip_header: 跳过文件开头的行数。
skip_footer: 跳过文件末尾的行数。
missing_values: 指定表示缺失值的字符串。
filling_values: 指定用于填充缺失值的值。
usecols: 指定要读取的列的索引。
names: 如果为 True, 则从第一行读取列名。也可以指定列名列表。
usemask: 如果为 True, 返回一个 masked array。
代码实践:
假设我们有一个名为 data_missing.txt 的文件,内容如下:
1, 2, NA 4, , 6 7, 8, 9
示例 1:处理缺失值
import numpy as np data = np.genfromtxt('data_missing.txt', delimiter=',', missing_values='NA', filling_values=-1) print(data)
输出:
[[ 1. 2. -1.] [ 4. -1. 6.] [ 7. 8. 9.]]
示例 2:指定数据类型和列名
假设我们有一个名为 data_named.txt 的文件,内容如下:
ID,Value1,Value2 1,10,20 2,30,40 3,50,60
import numpy as np data = np.genfromtxt('data_named.txt', delimiter=',', names=True, dtype=None, encoding='bytes') print(data) print(data.dtype.names)
输出:
[(1, 10, 20) (2, 30, 40) (3, 50, 60)] ('ID', 'Value1', 'Value2')
在这个例子中,dtype=None 允许 NumPy 自动检测每一列的数据类型。 names=True 告诉 genfromtxt 从第一行读取列名。
示例 3:使用 usecols 和 converters
假设我们有一个名为 data_mixed.txt 的文件,内容如下:
1, 2.5, abc 4, 5.0, def 7, 7.5, ghi
import numpy as np def convert_string(s): return s.strip().decode('utf-8') # 解码字节串 data = np.genfromtxt('data_mixed.txt', delimiter=',', dtype=[('col1', 'i4'), ('col2', 'f4'), ('col3', 'U5')], converters={2: convert_string}) print(data) print(data.dtype)
输出:
[(1, 2.5, 'abc') (4, 5. , 'def') (7, 7.5, 'ghi')] [('col1', '<i4'), ('col2', '<f4'), ('col3', '<U5')]
在这个例子中,我们使用 dtype 来指定每一列的数据类型,并使用 converters 将第三列的字符串数据进行转换。 需要注意,genfromtxt 默认以字节串读取文本数据,因此我们需要使用 decode('utf-8') 将其转换为字符串。
3.3.4 总结与对比
loadtxt() 适用于简单、格式一致的文本文件。速度更快,内存效率更高。
genfromtxt() 更通用,可以处理缺失值、不同数据类型和更复杂的格式。功能更强大,但速度较慢。
选择哪个函数取决于你的数据格式和需求。 如果你的数据格式简单且一致,loadtxt() 是一个不错的选择。如果你的数据包含缺失值或更复杂的格式,genfromtxt() 是更好的选择。
3.3.5 流程图
可以使用 Mermaid 图表来可视化从文件读取数据创建数组的流程:
3.3.6 注意事项
文件路径: 确保文件路径正确,并且文件存在。
分隔符: 正确指定分隔符,否则数据将无法正确解析。
数据类型: 确保指定的数据类型与文件中的数据类型匹配,或者使用 dtype=None 让 NumPy 自动检测数据类型。
缺失值: 如果文件中包含缺失值,请使用 genfromtxt() 并指定 missing_values 和 filling_values 参数。
编码: 确保文件的编码方式正确,否则可能会出现乱码。可以使用 encoding 参数指定编码方式。
3.3.7 额外说明
除了 loadtxt() 和 genfromtxt(),NumPy 还提供了其他一些函数来读取数据,例如 fromfile() 和 fromregex()。 这些函数更适用于特定的文件格式和数据结构,但不如 loadtxt() 和 genfromtxt() 常用。
总而言之,loadtxt() 和 genfromtxt() 是 NumPy 中从文件读取数据创建数组的两个主要工具。 掌握它们的使用方法对于进行数据分析和科学计算至关重要。 根据你的数据格式和需求,选择合适的函数,并注意处理缺失值、数据类型和编码等问题,才能成功地将数据导入到 NumPy 的 ndarray 中,并进行后续的处理和分析。