详解Python中genfromtxt的用法(numpy)
genfromtxt在做一些数据预加载的时候,需要对数据做一些处理,可以让数据更合理化
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')
更多推荐
所有评论(0)