genfromtxt导入数据:简而言之,genfromtxt主要运用两种循环第一个循环以字符串序列转换文件的每一行。第二个循环将每个字符串转换为适当的数据类型,考虑到缺失值的情况。
genfromtxt
的唯一强制参数是数据的来源。它可以是一个字符串,一串字符串或一个生成器。如果提供了单个字符串,则假定它是本地或远程文件的名称,或者带有read
方法的开放文件类对象。识别的文件类型是文本文件和档案。目前,该功能可识别
gzip
和bz2
(bzip2)档案。归档文件的类型由文件的扩展名决定:如果文件名以'.gz'
结尾,则需要一个gzip
归档文件;如果它以'bz2'
结尾,则假定bzip2
存档。
delimiter
参数:一旦文件被定义并打开进行读取,genfromtxt
会将每个非空行分割为一串字符串。 空的或注释的行只是略过。delimiter
关键字用于定义拆分应该如何进行。默认情况下,genfromtxt
假定delimiter=None
,意味着该行沿着空白区域(包括制表符)分割,并且连续的空白区域被视为单个空白区域。或者,我们可能正在处理一个固定宽度的文件,其中列被定义为给定数量的字符。在这种情况下,我们需要将delimiter
设置为单个整数(如果所有列的大小相同)或整数序列(如果列的大小可能不同)import numpy as np from io import BytesIO data = "1, 2, 3\n4, 5, 6" print(np.genfromtxt(BytesIO(data), delimiter=",")) ''' array([[ 1., 2., 3.], [ 4., 5., 6.]]) '''
>>> data = " 1 2 3\n 4 5 67\n890123 4" >>> np.genfromtxt(BytesIO(data), delimiter=3) array([[ 1., 2., 3.], [ 4., 5., 67.], [ 890., 123., 4.]]) >>> data = "123456789\n 4 7 9\n 4567 9" >>> np.genfromtxt(BytesIO(data), delimiter=(4, 3, 2)) array([[ 1234., 567., 89.], [ 4., 7., 9.], [ 4., 567., 9.]])
autostrip
参数默认情况下,当一行被分解为一系列字符串时,单个条目不会被剥离前导空白或尾随空白。通过将可选参数autostrip设置为值True,可以覆盖此行为:
>>> data = "1, abc , 2\n 3, xxx, 4" >>> # Without autostrip >>> np.genfromtxt(BytesIO(data), delimiter=",", dtype="|S5") array([['1', ' abc ', ' 2'], ['3', ' xxx', ' 4']], dtype='|S5') >>> # With autostrip >>> np.genfromtxt(BytesIO(data), delimiter=",", dtype="|S5", autostrip=True) array([['1', 'abc', '2'], ['3', 'xxx', '4']], dtype='|S5')
#
comments
参数可选参数
comments
用于定义标记注释开始的字符串。默认情况下,genfromtxt
假定comments='#'
。评论标记可能发生在线上的任何地方。评论标记之后的任何字符都会被忽略,如果可选参数names=True
,则会检查第一条注释行的名称。:>>> data = """# ... # 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(BytesIO(data), comments="#", delimiter=",") [[ 1. 2.] [ 3. 4.] [ 5. 6.] [ 7. 8.] [ 9. 0.]]
skip_header
和skip_footer
参数文件中存在标题可能会妨碍数据处理。在这种情况下,我们需要使用
skip_header
可选参数。此参数的值必须是一个整数,与执行任何其他操作之前在文件开头跳过的行数相对应。同样,我们可以使用skip_footer
属性跳过文件的最后一行n
,并给它一个n
的值,默认情况下,skip_header=0
和skip_footer=0.
:>>> data = "\n".join(str(i) for i in range(10)) >>> np.genfromtxt(BytesIO(data),) array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) >>> np.genfromtxt(BytesIO(data), ... skip_header=3, skip_footer=5) array([ 3., 4.])
usecols
参数在某些情况下,我们对数据的所有列不感兴趣,但只有其中的一小部分。我们可以用
usecols
参数选择要导入的列。该参数接受与要导入的列的索引相对应的单个整数或整数序列。请记住,按照惯例,第一列的索引为0。负整数的行为与常规Python负向索引相同。例如,如果我们只想导入第一列和最后一列,我们可以使用
usecols =(0, -1)
:>>> data = "1 2 3\n4 5 6" >>> np.genfromtxt(BytesIO(data), usecols=(0, -1)) array([[ 1., 3.], [ 4., 6.]])
如果列有名称,我们也可以通过将它们的名称提供给
usecols
参数来选择要导入哪些列,可以将其作为字符串序列或逗号分隔字符串:>>> data = "1 2 3\n4 5 6" >>> np.genfromtxt(BytesIO(data), ... names="a, b, c", usecols=("a", "c")) array([(1.0, 3.0), (4.0, 6.0)], dtype=[('a', '<f8'), ('c', '<f8')]) >>> np.genfromtxt(BytesIO(data), ... names="a, b, c", usecols=("a, c")) array([(1.0, 3.0), (4.0, 6.0)], dtype=[('a', '<f8'), ('c', '<f8')])
更多参数和功能请查阅Numpy中文网。