简介在做科学计算的时候,我们需要从外部加载数据。今天给大家介绍一下NumPy中一个非常好用的方法,genfromtxt。genfromtxt可以分解为两个步骤。第一步是从文件中读取数据并将其转换为字符串。第二步是将字符串转换成指定的数据类型。genfromtxt介绍先看genfromtxt的定义:numpy.genfromtxt(fname,dtype=,comments='#',delimiter=None,skip_header=0,skip_footer=0,converters=None,missing_values=None,filling_values=None,usecols=None,names=None,excludelist=None,deletechars="!#$%&'()*+,-./:;<=>?@[\]^{|}~",replace_space='_',autostrip=False,case_sensitive=True,defaultfmt='f%i',unpack=None,usemask=False,loose=True,invalid_raise=True,max_rows=None,encoding='bytes')genfromtxt可以接受多个参数。这么多参数中,只有fname是必选参数,其他都是可选的。fname可以采用多种形式,可以是文件、str、pathlib.Path、str列表或生成器。如果是单个str,则默认为本地或远程文件的名称。如果是str的列表,那么每一个str都被当作文件中的一行数据。如果传入远程文件,该文件将自动下载到本地目录。genfromtxt还可以自动识别文件是否为压缩类型,目前支持两种压缩方式:gzip和bz2。接下来看看genfromtxt的常见应用:在使用之前,通常需要导入两个库:fromioimportStringIOimportnumpyasnpStringIO会生成一个String对象,可以作为genfromtxt的输入。我们首先定义一个包含不同类型的StringIO:s=StringIO(u"1,1.3,abcde")这个StringIO包含一个int、一个float和一个str。分隔符是,.我们看一下genfromtxt最简单的用法:In[65]:data=np.genfromtxt(s)In[66]:dataOut[66]:array(nan)因为默认分隔符是delimiter=None,所以StringIO中的数据会整体转化为数组,结果为nan。下面我们添加一个逗号分隔符:In[67]:_=s.seek(0)In[68]:data=np.genfromtxt(s,delimiter=",")In[69]:dataOut[69]:array([1.,1.3,nan])这次有输出,但是因为最后一个字符串无法转为float,所以得到的是nan。请注意,我们的第一行需要将StringIO指针重置为文件的开头。这里我们使用s.seek(0)。那么如何转换最后一个str呢?我们需要手动指定数据类型:In[74]:_=s.seek(0)In[75]:data=np.genfromtxt(s,dtype=float,delimiter=",")In[76]:dataOut[76]:array([1.,1.3,nan])上面我们指定了所有的数组类型都是float,我们也可以为数组的每个元素指定类型:在[77]:_=s.seek(0)在[78]中:data=np.genfromtxt(s,dtype=[int,float,'S5'],delimiter=",")在[79]中:dataOut[79]:array((1,1.3,b'abcde'),dtype=[('f0','>>data=u"1,2,3\n4,5,6">>>np.genfromtxt(StringIO(data),delimiter=",")array([[1.,2.,3.],[4.,5.,6.]])autostrip使用autostrip删除数据两边的空格:>>>data=u"1,abc,2\n3,xxx,4">>>#没有autostrip>>>np.genfromtxt(StringIO(data),delimiter=",",dtype="|U5")array([['1','abc','2'],['3','xxx','4']],dtype='>>#自动剥离>>>np.genfromtxt(StringIO(data),分隔符=",",dtype="|U5",autostrip=True)array([['1','abc','2'],['3','xxx','4']],dtype='>>data=u"""#...#跳过我!...#也跳过我!...1,2...3,4...5,6#这是第三行数据...7,8...#这是最后一行...9,0...""">>>np.genfromtxt(StringIO(data),comments="#",delimiter=",")array([[1.,2.],[3.,4.],[5.,6.],[7.,8.],[9.,0.]])跳过行并且选择列可以使用skip_header和skip_footer跳过返回数组中的特定行:>>>data=u"\n".join(str(i)foriinrange(10))>>>np.genfromtxt(StringIO(数据),)array([0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])>>>np.genfromtxt(StringIO(数据),...skip_header=3,skip_footer=5)array([3.,4.])您可以使用usecols选择特定行数:>>>data=u"123\n456">>>np.genfromtxt(StringIO(data),usecols=(0,-1))array([[1.,3.],[4.,6.]])如果列有名称,可以使用使用cols选择列名:>>>data=u"123\n456">>>np.genfromtxt(StringIO(data),...names="a,b,c",usecols=("a","c"))数组([(1.0,3.0),(4.0,6.0)],dtype=[('a','>>np.genfromtxt(StringIO(数据),...names="a,b,c",usecols=("a,c"))array([(1.0,3.0),(4.0,6.0)],dtype=[('a','