3.3 从文件读取数据创建数组 (简要介绍,文件操作可单独章节)


文档摘要

3.3 从文件读取数据创建数组 (简要介绍,文件操作可单独章节) 第三章:ndarray 的创建 3.3 从文件读取数据创建数组 NumPy 提供了强大的工具,可以从各种文件格式中读取数据,并将其直接转换为 ndarray 对象。这对于处理大量数据,尤其是科学计算和数据分析任务至关重要。本节将重点介绍两种常用的方法: 和 。文件操作本身比较复杂,可以单独作为一个章节来详细介绍,这里我们假设文件已经存在并且可以访问。 3.3.1 概述 从文件读取数据创建数组的主要目的是将存储在外部文件(如文本文件、CSV 文件等)中的数据导入到 NumPy 的 ndarray 中,以便进行后续的数值计算、分析和处理。NumPy 提供了多种函数来实现这个目的,其中最常用的是 和 。

3.3 从文件读取数据创建数组 (简要介绍,文件操作可单独章节)

第三章:ndarray 的创建

3.3 从文件读取数据创建数组

NumPy 提供了强大的工具,可以从各种文件格式中读取数据,并将其直接转换为 ndarray 对象。这对于处理大量数据,尤其是科学计算和数据分析任务至关重要。本节将重点介绍两种常用的方法:numpy.loadtxt()numpy.genfromtxt()。文件操作本身比较复杂,可以单独作为一个章节来详细介绍,这里我们假设文件已经存在并且可以访问。

3.3.1 概述

从文件读取数据创建数组的主要目的是将存储在外部文件(如文本文件、CSV 文件等)中的数据导入到 NumPy 的 ndarray 中,以便进行后续的数值计算、分析和处理。NumPy 提供了多种函数来实现这个目的,其中最常用的是 loadtxtgenfromtxt

  • 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:使用 usecolsconverters

假设我们有一个名为 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_valuesfilling_values 参数。

  • 编码: 确保文件的编码方式正确,否则可能会出现乱码。可以使用 encoding 参数指定编码方式。

3.3.7 额外说明

除了 loadtxt()genfromtxt(),NumPy 还提供了其他一些函数来读取数据,例如 fromfile()fromregex()。 这些函数更适用于特定的文件格式和数据结构,但不如 loadtxt()genfromtxt() 常用。

总而言之,loadtxt()genfromtxt() 是 NumPy 中从文件读取数据创建数组的两个主要工具。 掌握它们的使用方法对于进行数据分析和科学计算至关重要。 根据你的数据格式和需求,选择合适的函数,并注意处理缺失值、数据类型和编码等问题,才能成功地将数据导入到 NumPy 的 ndarray 中,并进行后续的处理和分析。


发布者: 作者: 转发
评论区 (0)
U