详细介绍 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')])

猜你喜欢

转载自blog.csdn.net/weixin_42512684/article/details/115285771
今日推荐