详细介绍 Numpy 中 genfromtxt 函数用法
作者:互联网
关注公众号:【小张Python】,为你准备了 50+ 本Python 精品电子书籍 与 50G + 优质视频学习资料,后台回复关键字:1024 即可获取;如果对博文内容有什么疑问,公众号后台添加作者【个人微信】,可与作者直接进行交流
Numpy 中导入数据方式有多种,其中函数之一为 genfromtxt ,genformtxt 相对其他函数有自己的优势和劣势,
- 劣势:相对其它函数数据加载慢,从数据读入到返回需要两个迭代循环,第一个迭代将文件中每一行转化为一个字符串序列,第二个循环迭代对每个字符串序列指定合适的数据类型;源于这两个迭代原因,相对其它函数会慢一点;
- 优势:更灵活,数据加载时会能够处理丢失数据,例如对某些 missing_values 做一些数据填充,或将某一列数据从一中形式转化为另一种形式;
函数语法如下:
genfromtxt(fname,dtype,comments,delimiter,skipd_header,skip_fonter,converters,missing_values,filling_values,usecols,names, autostrip,**kwarg)
-
fname -> str/list /IO Object 等等,表示数据源;文件路径,字符串列表、StringIO 对象都可;
-
dtype -> dtype,最终数组的数据类型;
-
comments -> str,注释标识符,加载时会自动忽略位于注释标识符后面的字符串;
-
delimiter -> str/int/sequence,分割符,加载时来分割字符串,比较常见的就是逗号,也可以指定 int 整形表示每一个元素最大宽度;也可以是字符列表,表示分割符可为多个字符;
-
skip_header -> int,数据加载时跳过文件头部的字符行数;
-
skip_footer -> int,数据加载时跳过文件尾部字符串行数;
-
converters -> variable,可以是字典形式也可以是 lambda 函数,表示将某一种数据格式转化为另一种数据格式;
-
missing_values -> variable,指定数组中 missing value;
-
filling_values -> variable,指定 filling_values,来替代 missing_value;
-
usercols -> sequence,指定需读取的列数, 0 表示第一列,-1 为最后一列;
上面列举出各参数基本用法后,下面将针对里面每个参数,结合实例详细介绍其用法
fname 参数
入的 fname 是以 gz 结尾的话,读取时会在加载数据之前自动解压,但较为常见的都是 txt 文本
delimiter参数
当 delimiter 为字符时,表示分割符,元素以分割符进行分割
>>> data = u"1, 2, 3\n4, 5, 6"
>>> np.genfromtxt(StringIO(data), delimiter=",")
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
当 delimiter 表示整数元组时,代表每一列所在元素最大宽度;如下定义了每一列元素最大宽度分别为4,3,2;
>>> data = u" 1 2 3\n 4 5 67\n890123 4"
>>> np.genfromtxt(StringIO(data), delimiter=3)
array([[ 1., 2., 3.],
[ 4., 5., 67.],
[ 890., 123., 4.]])
>>> data = u"123456789\n 4 7 9\n 4567 9"
>>> np.genfromtxt(StringIO(data), delimiter=(4, 3, 2))
array([[ 1234., 567., 89.],
[ 4., 7., 9.],
[ 4., 567., 9.]])
autostrip 参数
对于每行字符串用 分割符分割后,得到的单个元素可能会含有一些制表符或空格等标识符;autostrip 参数设为 True,元素中的空格标识符会被自动删除~
>>> data = u"1, abc , 2\n 3, xxx, 4"
>>> # Without autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5")
array([['1', ' abc ', ' 2'],
['3', ' xxx', ' 4']], dtype='<U5')
>>> # With autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5", autostrip=True)
array([['1', 'abc', '2'],
['3', 'xxx', '4']], dtype='<U5')
comments 参数
comments表示注释标识符,指定后注释标识符所在行后面的字符会被自动省略,如下:
>>> data = u"""#
... # Skip me !
... # Skip me too !
... 1, 2
... 3, 4
... 5, 6 #This is the third line of the data
... 7, 8
... # And here comes the last line
... 9, 0
... """
>>> np.genfromtxt(StringIO(data), comments="#", delimiter=",")
array([[1., 2.],
[3., 4.],
[5., 6.],
[7., 8.],
[9., 0.]])
skip_header,skip_footer
读取数据时,可能前几行后者后几行的数据我们不需要,此时设定 skip_header、skip_footer 参数即可,例如读取时 想过滤数据列表中 前三行、后五行数据,此时参数设定时 skip_header=3,skip_footer=5
即可
>>> data = u"\n".join(str(i) for i in range(10))
>>> np.genfromtxt(StringIO(data),)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
>>> np.genfromtxt(StringIO(data),
... skip_header=3, skip_footer=5)
array([ 3., 4.])
usecols
usecols 参数来指定只读取数据中指定的列,与数组索引用法相似,下面是只提取原数据中第一列和最后一列数据:
>>> data = u"1 2 3\n4 5 6"
>>> np.genfromtxt(StringIO(data), usecols=(0, -1))
array([[ 1., 3.],
[ 4., 6.]])
converters
converters 用来对数组中一些数据进行格式替换,以字典形式定义 key 表示需要数据转化的列索引,value 为转换函数,下面实例中将百分比转化为浮点型
>>> data = u"1, , 3\n 4, 5, 6"
>>> convert = lambda x: float(x.strip() or -999)
>>> np.genfromtxt(StringIO(data), delimiter=",",
... converters={1: convert})
array([[ 1., -999., 3.],
[ 4., 5., 6.]])
missing_values,filling_values
读取的数据中一般出现缺失值,而这些缺失值有时对最终分析结果影响很大,我们需要做的就是将这些缺失值用某些值来代替,这里就需要用到 missing_values 、filling_values ,前者标记缺失值,后者对missing_values 进行填充 ,
例如下面的实例,分别将 0,1,2 列数据中的 'N/A'、空格、‘???’ 替换为 0,0,-999;
>>> data = u"N/A, 2, 3\n4, ,???"
>>> kwargs = dict(delimiter=",",
... dtype=int,
... names="a,b,c",
... missing_values={0:"N/A", 'b':" ", 2:"???"},
... filling_values={0:0, 'b':0, 2:-999})
>>> np.genfromtxt(StringIO(data), **kwargs)
array([(0, 2, 3), (4, 0, -999)],
dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')])
标签:...,StringIO,Numpy,data,delimiter,values,用法,genfromtxt 来源: https://www.cnblogs.com/zeroing0/p/14590117.html