Numpy 的 genfromtext(~)
方法读取文本文件,并将其内容解析为 Numpy 数组。与 Numpy 的 loadtxt(~)
方法不同,genfromtxt(~)
适用于缺失的数字。
参数
1. fname
| string
文件的名称。如果该文件与脚本不在同一目录中,请确保也包含该文件的路径。
2. dtype
| string
或 type
或 list<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
| string
或 sequence<string>
| optional
将被视为缺失值的字符串序列。这仅在 usemask=True
时相关。请参阅示例以进行澄清。
11.filling_values
| value
或 dict
或 sequence<value>
| optional
如果传递单个值,则所有缺失值和无效值都将被该值替换。通过传递一个字典,您可以为不同的列指定不同的填充值。键是列整数索引,值是该列的填充值。
12.usecols
| int
或 sequence
| optional
您要读取的列的整数索引。默认情况下, usecols=None
,即读取所有列。
13.names
| None
或 True
或 string
或 sequence<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 或 sequence
或 dict
| optional
要从名称中删除的字符。
16.defaultfmt
| string
| optional
结果字段名称的格式。语法遵循 Python 标准字符串格式化程序的语法:
17.autostrip
| boolean
| optional
是否删除值中的前导和尾随。这仅适用于字符串值。默认情况下,autostrip=False
。
18.replace_space
| string
| optional
用于替换字段名称中的空格的字符串。请注意,前导和尾随空格将被删除。默认情况下,replace_space="_"
。
19.case_sensitive
| string
或 boolean
| 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.]])
指定skip_footer
假设我们的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_values
的 usemask=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=True
和 missing_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.]])
相关用法
- Python genericalias.__parameters__用法及代码示例
- Python Django get_language_info用法及代码示例
- Python Pandas get_dummies方法用法及代码示例
- Python PIL getbands() and getextrema()用法及代码示例
- Python PIL getpixel()用法及代码示例
- Python getattr()用法及代码示例
- Python OpenCV getTrackbarPos()用法及代码示例
- Python Django get用法及代码示例
- Python NumPy get_printoptions方法用法及代码示例
- Python OpenCV getgaussiankernel()用法及代码示例
- Python OpenCV getRotationMatrix2D()用法及代码示例
- Python Django get_messages用法及代码示例
- Python PIL getbands()用法及代码示例
- Python gettext.GNUTranslations.ngettext用法及代码示例
- Python PIL getpalette()用法及代码示例
- Python PIL getcolors()用法及代码示例
- Python Django get_user_model用法及代码示例
- Python NumPy geomspace方法用法及代码示例
- Python gettext.NullTranslations.install用法及代码示例
- Python Tableau groups.update用法及代码示例
- Python gzip.compress(s)用法及代码示例
- Python globals()用法及代码示例
- Python Tableau groups.delete用法及代码示例
- Python Tableau groups.create用法及代码示例
- Python numpy string greater_equal()用法及代码示例
注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 NumPy | genfromtxt method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。