【注】:该文章运行结果的numpy版本官方最新2.1版本, 运行结果不同可能是版本问题
在数据科学和分析中,处理文本和CSV文件是常见的任务。numpy
提供了一个强大的函数 numpy.genfromtxt
,能够灵活地读取包含缺失值的数据。本文将介绍如何使用 numpy.genfromtxt
读取不同格式的数据,包括处理缺失值和自定义分隔符的情况。
基本用法
读取没有缺失值的文本文件
当数据中没有缺失值时,可以使用 numpy.loadtxt
来读取数据。但当数据中包含缺失值时,建议使用 numpy.genfromtxt
。
读取包含缺失值的CSV文件
假设我们有一个名为 csv.txt
的文件,内容如下:
1, 2, 3
4,, 6
7, 8, 9
我们可以使用以下代码来读取这个文件:
import numpy as np
# 读取带有缺失值的CSV文件,并返回掩码数组
masked_array = np.genfromtxt("csv.txt", delimiter=",", usemask=True)
print(masked_array)
输出结果为:
masked_array(
data=[[1.0, 2.0, 3.0],
[4.0, --, 6.0],
[7.0, 8.0, 9.0]],
mask=[[False, False, False],
[False, True, False],
[False, False, False]],
fill_value=1e+20)
如果我们希望得到一个填充缺失值的数组,可以使用以下代码:
# 读取数据并用 np.nan 填充缺失值
array_output_nan = np.genfromtxt("csv.txt", delimiter=",")
print(array_output_nan)
输出结果为:
array([[ 1., 2., 3.],
[ 4., nan, 6.],
[ 7., 8., 9.]])
我们还可以指定一个填充值来替换缺失值。例如:
# 用指定的填充值填充缺失值
array_output_fill_value = np.genfromtxt("csv.txt", delimiter=",", dtype=np.int8, filling_values=99)
print(array_output_fill_value)
输出结果为:
array([[ 1, 2, 3],
[ 4, 99, 6],
[ 7, 8, 9]], dtype=int8)
处理空白分隔符的数据
numpy.genfromtxt
也可以处理空白分隔符的数据文件。例如,假设我们有一个固定宽度的文件 fixedwidth.txt
,内容如下:
1 2 3
44 6
7 88889
我们可以使用以下代码读取该文件:
data = np.genfromtxt("fixedwidth.txt", delimiter=4)
print(data)
输出结果为:
array([[1.000e+00, 2.000e+00, 3.000e+00],
[4.400e+01, nan, 6.000e+00],
[7.000e+00, 8.888e+03, 9.000e+00]])
指定缺失值
有时,数据文件中可能使用特定字符表示缺失值。例如,假设 nan.txt
文件的内容如下:
1 2 3
44 x 6
7 8888 9
我们可以将 x
指定为缺失值:
array_with_missing_values = np.genfromtxt("nan.txt", missing_values="x")
print(array_with_missing_values)
输出结果为:
array([[1.000e+00, 2.000e+00, 3.000e+00],
[4.400e+01, nan, 6.000e+00],
[7.000e+00, 8.888e+03, 9.000e+00]])
跳过缺失值的行
在某些情况下,您可能希望跳过包含缺失值的行。为此,可以设置 invalid_raise=False
:
data_to_skip = np.genfromtxt("skip.txt", invalid_raise=False)
print(data_to_skip)
这里的 skip.txt
文件内容为:
1 2 3
44 6
7 888 9
输出结果为:
array([[ 1., 2., 3.],
[ 7., 888., 9.]])
处理不同分隔符的情况
如果数据以制表符(\t
)分隔且缺失值用空格表示,我们可以使用以下代码读取:
data_tabs = np.genfromtxt("tabs.txt", delimiter="\t", missing_values=" +")
print(data_tabs)
tabs.txt
文件的内容如下:
1 2 3
44 6
7 888 9
输出结果为:
array([[ 1., 2., 3.],
[ 44., nan, 6.],
[ 7., 888., 9.]])
结论
numpy.genfromtxt
是一个非常灵活和强大的工具,能有效地读取和处理包含缺失值和不同分隔符的数据文件。通过本文提供的示例,您可以轻松地在自己的项目中应用它。无论是处理CSV文件还是其他格式的文本文件,numpy.genfromtxt
都能帮助您快速而高效地获取所需的数据。