genfromtxt是numpy的一个内置函数,主要是针对数据集的导入

import numpy as np
from io import StringIO

help(np.genfromtxt)
Help on function genfromtxt in module numpy.lib.npyio:

genfromtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None)

More....

        可以看到这个函数有很多参数,help也有英文解释,现在我们来实操熟悉它,这个函数在做一些数据预加载的时候,需要对数据做一些处理,还是很有用处的。
fname:文件名,也可以是字符串、列表、StringIO对象、迭代器等,如果是文件名是 '.gz' or '.bz2',还可以自动解压处理
dtype:指定数据类型(不同类型需要指定)
delimiter:分隔符(比如一般使用",")

s=StringIO("1,2.3,3.5")
data=np.genfromtxt(s,delimiter=",")
#array([1. , 2.3, 3.5])

s=StringIO("1,2.3,China")
data=np.genfromtxt(s,dtype=[('myint','i8'),('myfloat','f8'),('mystring','S5')],delimiter=",")
#array((1, 2.3, b'China'),dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])

skip_header,skip_footer:分别去掉头部的字符行数和尾部的字符行数

s='\n'.join(str(i) for i in range(10))
data=np.genfromtxt(StringIO(s),skip_header=2,skip_footer=1,delimiter="\n")
#array([2., 3., 4., 5., 6., 7., 8.])
头部的2行以及最后1行去掉了

converters:格式的转换,比如转换成浮点数,先将空白替换成-999

s="11, ,33\n44,55,66"
data=np.genfromtxt(StringIO(s),delimiter=",",converters={1:lambda x: float(x.strip() or -999)})

#array([[  11., -999.,   33.],[  44.,   55.,   66.]])

missing_values,filling_values:缺失值与填充值,一般读取大量数据可能存在一些缺失数据的情况,很有必要做填充或替换

s="None, ,33\n44,55,???"
kwargs=dict(delimiter=",",dtype=int,names="a,b,c",missing_values={'a':"None", 'b':" ", 'c':"???"},filling_values={'a':-1, 'b':0, 'c':-999})
data=np.genfromtxt(StringIO(s),**kwargs)
#array([(-1,  0,   33), (44, 55, -999)],dtype=[('a', '<i4'), ('b', '<i4'), ('c', '<i4')])

usecols:选取列,比如选取第一列和最后一列

s="1 2 3 55\n11 25 6 77"
data=np.genfromtxt(StringIO(s),usecols=(0, -1))
#array([[ 1., 55.], [11., 77.]])

autostrip:自动剔除制表符与空格

s="1,2,  \t3,55\n11,25,  6  ,77"
data1=np.genfromtxt(StringIO(s),delimiter=',',dtype="|U5")
data2=np.genfromtxt(StringIO(s),delimiter=',',dtype="|U5",autostrip=True)

(array([['1', '2', '  \t3', '55'],
        ['11', '25', '  6  ', '77']], dtype='<U5'),
 array([['1', '2', '3', '55'],
        ['11', '25', '6', '77']], dtype='<U5'))

附加StringIO的说明

        看名称就可以了解到是字符串的IO输入输出对象,我们可以将它当作一个文件对象来操作,区别在于文件是存放在硬盘,而StringIO是直接存放在内存

from io import StringIO
a1=StringIO()
a1.write('Tony')
a1.write(' GANGAN神')
print(a1.getvalue())

Tony GANGAN神

如果不是字符串而是二进制,那就使用BytesIO对象

from io import BytesIO
a2=BytesIO()
a2.write('你好Tony'.encode('UTF-8'))
print(a2.getvalue())

b'\xe4\xbd\xa0\xe5\xa5\xbdTony'

其类型是<class 'bytes'>

解码a2.getvalue().decode('UTF-8')

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐