当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python NumPy genfromtxt方法用法及代码示例


Numpy 的 genfromtext(~) 方法读取文本文件,并将其内容解析为 Numpy 数组。与 Numpy 的 loadtxt(~) 方法不同,genfromtxt(~) 适用于缺失的数字。

参数

1. fname | string

文件的名称。如果该文件与脚本不在同一目录中,请确保也包含该文件的路径。

2. dtype | stringtypelist<string>list<type> | optional

所构造数组所需的数据类型。默认情况下,dtype=float64 。这意味着所有整数也将转换为浮点数。

如果您设置 dtype=None ,那么 Numpy 将尝试从您的值推断类型。这可能比您自己设置类型要慢得多。

3. comments | string | optional

如果您的输入文件包含注释,那么您可以指定标识注释的内容。默认情况下, comments="#" ,即同一行中 # 后面的字符将被视为注释。如果您的文本文件不包含任何注释,您可以设置None

4. delimiter | string | optional

用于分隔数据的字符串。默认情况下,分隔符是空格。

5. skiprows | int | optional

在 Numpy 1.10 版本中,该参数已被 skip_header 取代。

6. skip_header | int | optional

开头要跳过的行数。请注意,这包括评论。默认情况下,skiprows=0

7. skip_footer | int | optional

最后要跳过的行数。请注意,这包括评论。默认情况下,skiprows=0

8. converters | dict<int,function> | optional

您可以应用映射来转换列值。键是列的整数索引,值是所需的映射。检查下面的示例以进行说明。默认情况下,dict=None

9. missing | string | optional

在 Numpy 1.10 版本中,该参数已被 missing_values 取代。

10.missing_values | stringsequence<string> | optional

将被视为缺失值的字符串序列。这仅在 usemask=True 时相关。请参阅示例以进行澄清。

11.filling_values | valuedictsequence<value> | optional

如果传递单个值,则所有缺失值和无效值都将被该值替换。通过传递一个字典,您可以为不同的列指定不同的填充值。键是列整数索引,值是该列的填充值。

12.usecols | intsequence | optional

您要读取的列的整数索引。默认情况下, usecols=None ,即读取所有列。

13.names | NoneTruestringsequence<string> | optional

结果数组的字段名称。此参数仅与那些希望创建结构化数组的人相关。

类型

说明

None

将返回标准数组而不是结构化数组。

True

指定的 skip_header 行之后的第一行将被视为字段名称。

string

包含以逗号分隔的字段名称的单个字符串。

sequence

包含字段名称的类似数组的结构。

默认情况下,names=None

附带说明一下,结构化数组并不常用,因为 Pandas 库中的 Series 和 DataFrames 是更好的选择。

14.excludelist | sequence | optional

传递的字符串将附加到默认列表 ["return", "file", "print"] 中。请注意,下划线将附加到传递的字符串中(例如,如果传递"abc",则"abc_"将附加到默认列表中)。这仅与那些希望创建结构化数组的人相关。

15.deletechars | string 长度为 1 或 sequencedict | optional

要从名称中删除的字符。

16.defaultfmt | string | optional

结果字段名称的格式。语法遵循 Python 标准字符串格式化程序的语法:

17.autostrip | boolean | optional

是否删除值中的前导和尾随。这仅适用于字符串值。默认情况下,autostrip=False

18.replace_space | string | optional

用于替换字段名称中的空格的字符串。请注意,前导和尾随空格将被删除。默认情况下,replace_space="_"

19.case_sensitive | stringboolean | optional

如何处理字符串字符的大小写。

说明

True

保持 shell 原样。

False

将值转换为大写。

"upper"

将值转换为大写。

"lower"

将值转换为小写。

默认情况下,case_sensitive=True

20.unpack | boolean | optional

您可以通过将其设置为 True 来单独检索列数组,而不是使用一个巨大的 Numpy 数组。例如,col_one, col_two = np.genfromtxt(~, unpack=True) 。默认情况下,unpack=False

21.usemask | boolean | optional

是否返回掩码布尔数组。默认情况下,usemark=True

22.loose | boolean | optional

如果为 True,则无效值将转换为 nan 并且不会引发错误。默认情况下,loose=True

23.invalid_raise | boolean | optional

如果行中的值数与列数不匹配,则会引发错误。如果设置为 False,则将从结果数组中省略无效行。默认情况下,invalid_raise=True

24.max_rows | int | optional

要读取的最大行数。默认情况下,读取所有行。

25.encoding | string | optional

读取文件时使用的编码(例如"latin-1"、"iso-8859-1")。默认编码="bytes"。

返回值

包含导入数据的 Numpy 数组。

例子

基本用法

假设我们有以下名为 my_data.txt 的 text-file :

1 2 3 4
5 6 7 8

要导入此文件:

a = np.genfromtxt("my_data.txt")
a



array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]])

请注意,此 Python 脚本与 my_data.txt 位于同一目录中。

另外,无论文本文件中的数字是否都是整数,默认数据类型都是 float64

print(a.dtype)



float64

指定所需的数据类型

再次假设我们有以下名为 my_data.txt 的 text-file :

1 2 3 4
5 6 7 8

我们可以使用 dtype 指定类型,而不是使用默认的 float64

a = np.genfromtxt("my_data.txt", dtype=int)
a



array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

现在,所有值的类型均为 float64

您还可以传递类型列表以将不同类型分配给不同的列:

a = np.genfromtxt("my_data.txt", dtype=[np.int,32 int, np.float,32 float])
a



array([(1, 2, 3., 4.), (5, 6, 7., 8.)],
       dtype=[('f0', '<i4'), ('f1', '<i8'), ('f2', '<f4'), ('f3', '<f8')])

这里,i4代表int32,而i8代表int64

请注意,这是一种特殊类型的 Numpy 数组,称为结构化数组。这种类型的数组在实践中并不经常使用,因为 Pandas 库中的 Series 和 DataFrames 是具有更多函数的替代方案。

指定自定义分隔符

假设我们的my_data.txt文件如下:

1,2
3,4

由于我们的数据是逗号分隔的,因此设置delimiter=","如下:

a = np.genfromtxt("my_data.txt", delimiter=",")
a



1,2
3,4

处理评论

假设我们的my_data.txt文件如下:

1,2,3,4    / I'm the first row!
5,6,7,8    / I'm the second row!

要删除 text-file 中的注释,请指定 comments

a = np.genfromtxt("my_data.txt", delimiter=",", comments="/")
a



array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]])

指定skip_header

假设我们的my_data.txt文件如下:

1 2 3
4 5 6
7 8 9

要跳过第一行:

a = np.genfromtxt("my_data.txt", skip_header=1)
a



array([[4., 5., 6.],
       [7., 8., 9.]])

假设我们的my_data.txt文件如下:

1 2 3
4 5 6
7 8 9

要跳过最后一行:

a = np.genfromtxt("my_data.txt", skip_footer=1)
a



array([[1., 2., 3.],
       [4., 5., 6.]])

指定转换器

假设我们的my_data.txt文件如下:

1 2
3 4

举个任意的例子,假设我们想将第一列的所有值加 10,并使第二列的所有值都为 20:

a = np.genfromtxt("my_data.txt", converters={0: lambda x: int(x) + 10, 1: lambda x: 20})
a



array([(11, 20),
       (13, 20)], dtype=[('f0', '<i8'), ('f1', '<i8')])

这里,"f0""f1"是字段名称,并且"i8"表示int64数据类型。

指定missing_values

假设我们的my_data.txt文件如下:

3,??
,6

所有缺失和无效的值都被视为 nan ,因此您不需要在此处指定 missing_values="??"

a = np.genfromtxt("my_data.txt", delimiter=",")
a



array([[ 3., nan],
       [nan,  6.]])

请注意,无法将值 6 设置为缺失值。仅当您设置 usemask=True 时, missing_values 才会发挥作用。

这是没有 missing_valuesusemask=True

a = np.genfromtxt("my_data.txt", delimiter=",", usemask=True)
a



masked_array(
   data=[[3.0, nan],
         [--, 6.0]],
   mask=[[False, False],
         [ True, False]],
   fill_value=1e+20)

请注意此处如何区分缺失值和无效值 - ?? 已映射到 nan,掩码布尔值标记为 False ,而实际缺失值已映射到 --,掩码布尔值设置为 True.

现在,这是 usemask=Truemissing_values="??"

a = np.genfromtxt("my_data.txt", delimiter=",", missing_values="??", usemask=True)
a



masked_array(
   data=[[3.0, --],
         [--, 6.0]],
   mask=[[False,  True],
         [ True, False]],
   fill_value=1e+20)

这里的关键是, ?? 本质上是一个无效值,现在被视为 missing_value 。

指定filling_values

默认情况下,所有缺失和无效的值都将替换为 nan。要更改此设置,请指定 filling_values,如下所示:

a = np.genfromtxt("my_data.txt", delimiter=",", filling_values=0)
a



array([[3., 0.],
       [0., 6.]])

您还可以传入一个字典,其中包含以下键值对:

  • key:列整数索引

  • value:填充值

例如,设置将第一列的所有缺失值和无效值映射到 -1,将第二列的所有缺失值和无效值映射到 -2:

a = np.genfromtxt("my_data.txt", delimiter=",", filling_values={0:-1, 1:-2})
a



array([[ 3., -2.],
       [-1.,  6.]])

只读取某些列

假设我们的my_data.txt文件如下:

1 2 3
4 5 6

仅读取第一列和第三列(即列索引 0 和 2):

a = np.genfromtxt("my_data.txt", usecols=[0,2])
a



array([[1., 3.],
       [4., 6.]])

指定名称

假设我们的my_data.txt文件如下:

3 4
5 6

为每列指定名称:

a = np.genfromtxt("my_data.txt", names=("A","B"))
a



array([(3., 4.),
       (5., 6.)],
       dtype=[('A', '<f8'), ('B', '<f8')])

在这里,我们将名称 A 分配给第一列。请注意, f8 仅表示类型 float64

指定排除列表

假设我们的my_data.txt文件如下:

3 4 5
6 7 8

要将 _ 附加到某些名称:

a = np.genfromtxt("my_data.txt", names=["A","B","C"], excludelist=["A"])
a



array([(3., 4., 5.), (6., 7., 8.)],
      dtype=[('A_', '<f8'), ('B', '<f8'), ('C', '<f8')])

请注意我们如何将 A_ 作为第一列的字段名称。

指定删除字符

假设我们的my_data.txt文件如下:

3 4
5 6

要从字段名称中删除字符 "c"

a = np.genfromtxt("my_data.txt", names=["Ab","BcD"], deletechars="c")
a



array([(3., 4.), (5., 6.)], dtype=[('Ab', '<f8'), ('BD', '<f8')])

要删除多个字符:

a = np.genfromtxt("my_data.txt", names=["Ab","BcD"], deletechars=["c","A"])
a



array([(3., 4.), (5., 6.)], dtype=[('b', '<f8'), ('BD', '<f8')])

指定defaultfmt

假设我们的my_data.txt文件如下:

3 4
5 6

如果返回结果是结构化数组,并且未定义 names 参数,则字段名称默认采用 "f0""f1" 等值:

a = np.genfromtxt("my_data.txt", dtype=[int, float])
a



array([(3, 4.), (5, 6.)], dtype=[('f0', '<i8'), ('f1', '<f8')])

要对此进行自定义,请传递 defaultfmt 参数:

a = np.genfromtxt("my_data.txt", dtype=[int, float], defaultfmt="my_var_%i")
a



array([(3, 4.), (5, 6.)], dtype=[('my_var_0', '<i8'), ('my_var_1', '<f8')])

这里,%i 是列整数索引的占位符。

指定自动删除

假设我们的my_data.txt文件如下:

3,a, 4
 5 ,b c,6

默认情况下,值中出现的所有空格均保持不变:

a = np.genfromtxt("my_data.txt", delimiter=",", dtype="U")
a



array([['3', 'a', ' 4'],
       ['5 ', 'b c', '6']], dtype='<U5')

如果要去掉前导和尾随空格,请设置autostrip=True,如下所示:

a = np.genfromtxt("my_data.txt", delimiter=",", autostrip=True, dtype="U")
a



array([['3', 'a', '4'],
       ['5', 'b c', '6']], dtype='<U3')

请注意 "b c" 中的空格仍然存在。

指定replace_space

假设我们的my_data.txt如下:

3 4
5 6

默认情况下,非前导和非尾随空格替换为 _

a = np.genfromtxt("my_data.txt", names=["A B", " C "])
a



array([(3., 4.), (5., 6.)], dtype=[('A_B', '<f8'), ('C', '<f8')])

请注意前导空格和尾随空格是如何被去除的。

要用自定义字符串替换空格,请设置 replace_space 参数,如下所示:

a = np.genfromtxt("my_data.txt", names=["A B", " C "], replace_space="K")
a



array([(3., 4.), (5., 6.)], dtype=[('AKB', '<f8'), ('C', '<f8')])

指定case_sensitive

假设我们的my_data.txt如下:

3 4
5 6

默认情况下,case_sensitive 设置为 True,这意味着字段名称保持原样。

a = np.genfromtxt("my_data.txt", names=["Ab", "dC"])
a



array([(3., 4.), (5., 6.)], dtype=[('Ab', '<f8'), ('dC', '<f8')])

要将字段名称转换为大写,请设置 "upper"False

a = np.genfromtxt("my_data.txt", names=["Ab", "dC"], case_sensitive=False)
a



array([(3., 4.), (5., 6.)], dtype=[('AB', '<f8'), ('DC', '<f8')])

要将字段名称转换为小写,请设置 "lower"

a = np.genfromtxt("my_data.txt", names=["Ab", "dC"], case_sensitive="lower")
a



array([(3., 4.), (5., 6.)], dtype=[('ab', '<f8'), ('dc', '<f8')])

指定解包

假设我们的my_data.txt文件如下:

1 2
3 4

要检索每列的数据而不是单个 Numpy 数组:

col_one, col_two = np.genfromtxt("my_data.txt", unpack=True)
print("col_one:", col_one)
print("col_two:", col_two)



col_one: [3. 5.]
col_two: [4. 6.]

指定松散

假设我们的my_data.txt文件如下:

3 4
5 ??

默认情况下, loose=True ,这意味着无效值(例如此处的 ?? )将转换为 nan

a = np.genfromtxt("my_data.txt")
a



array([[ 3.,  4.],
       [ 5., nan]])

如果我们的文件包含无效值,要引发错误,请设置 loose=False ,如下所示:

a = np.genfromtxt("my_data.txt", loose=False)
a



ValueError: Cannot convert string '??'

指定invalid_raise

假设我们的my_data.txt文件如下:

3,4
5
7,8

此处,尽管数组看似有 2 列,但第二行仅包含 1 个值。

默认情况下, invalid_raise=True ,这意味着如果文件包含无效行,则会引发错误:

a = np.genfromtxt("my_data.txt", delimiter=",")
a



ValueError: Some errors were detected!
    Line #2 (got 1 columns instead of 2)

我们可以通过将其设置为 False 来选择忽略无效行,如下所示:

a = np.genfromtxt("my_data.txt", delimiter=",", invalid_raise=False)
a



array([[3., 4.],
       [7., 8.]])

不会引发任何错误,但 Numpy 足够好,可以向我们发出警告:

ConversionWarning: Some errors were detected!
    Line #2 (got 1 columns instead of 2)

指定所需尺寸

假设我们的 sample.txt 只有一行:

1 2 3 4

默认情况下,loadtxt(~) 将生成一个一维数组:

a = np.loadtxt("sample.txt")
a



array([1., 2., 3., 4.])

我们可以通过以下方式指定我们希望数组是二维的:

a = np.loadtxt("sample.txt", ndmin=2)
a



array([[1., 2., 3., 4.]])

指定max_rows

假设我们的my_data.txt文件如下:

1 2
3 4
5 6

仅读取前两行而不是整个文件:

a = np.genfromtxt("myy_data.txt", max_rows=2)
a



array([[1., 2.],
       [3., 4.]])

相关用法


注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 NumPy | genfromtxt method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。