import numpy as np
from io import StringIO
“”"
NumPy提供了几个函数来根据表格数据创建数组。我们将重点放在genfromtxt函数上。
genfromtxt的唯一强制参数是数据的来源。它可以是一个字符串,一串字符串或一个生成器。如果提供了单个字符串,则假定它是本地或远程文件的名称,或者带有read方法的开放文件类对象,例如文件或StringIO.StringIO对象。如果提供了字符串列表或生成器返回字符串,则每个字符串在文件中被视为一行。当传递远程文件的URL时,该文件将自动下载到当前目录并打开。
“”"
“”"
将行拆分为列
delimiter参数
一旦文件被定义并打开进行读取,genfromtxt会将每个非空行分割为一串字符串。 空的或注释的行只是略过。 delimiter关键字用于定义拆分应该如何进行。
通常,单个字符标记列之间的分隔。例如,逗号分隔文件(CSV)使用逗号(,)或分号(;)作为分隔符:
“”"
data = “1, 2, 3\n4, 5, 6”
a = np.genfromtxt(StringIO(data), delimiter=’,’)
print(“以逗号为分隔符的例子:\n{}\n”.format (a))
我们可能正在处理一个固定宽度的文件,其中列被定义为给定数量的字符。在这种情况下,我们需要将delimiter设置为单个整数(如果所有列的大小相同)或整数序列(如果列的大小可能不同):
data = " 1 2 3\n 4 5 67\n890123 4"
a = np.genfromtxt(StringIO(data), delimiter=3)
print(“固定宽度为3的例子 \n {} \n”.format (a))
data = “123456789\n 4 7 9\n 4567 9”
a = np.genfromtxt(StringIO(data), delimiter=(4, 3, 2))
print(“固定宽度分别为4,3,2 的例子 \n {} \n”.format (a))
autostrip参数
默认情况下,当一行被分解为一系列字符串时,单个条目不会被剥离前导空白或尾随空白。通过将可选参数autostrip设置为值True,可以覆盖此行为:
data = “1, abc , 2\n 3, xxx, 4”
Without autostrip
a = np.genfromtxt(StringIO(data), delimiter="," , dtype="|S5" )
print(“不自动去掉空格的例子 \n {} \n”.format (a))
With autostrip
a = np.genfromtxt(StringIO(data), delimiter=",", dtype="|S5", autostrip=True)
print(“加上autostrip参数不自动去掉空格的例子 \n {} \n”.format (a))
comments参数
可选参数comments用于定义标记注释开始的字符串。默认情况下,genfromtxt假定comments=’#’。评论标记可能发生在线上的任何地方。评论标记之后的任何字符都会被忽略:
str1 = ‘’’#
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 ‘’’
a = np.genfromtxt(StringIO(str1), comments="#", delimiter=",")
print(“定义#开头的作为注释行,自动略过,形成数组的例子: \n {} \n”.format (a ))
跳过直线并选择列
1. skip_header和skip_footer参数
文件中存在标题可能会妨碍数据处理。在这种情况下,我们需要使用skip_header可选参数。此参数的值必须是一个整数,与执行任何其他操作之前在文件开头跳过的行数相对应。同样,我们可以使用skip_footer属性跳过文件的最后一行n,并给它一个n的值:
data = “\n”.join(str(i) for i in range(10) )
a= np.genfromtxt(StringIO(data),)
a=np.genfromtxt(StringIO(str1), comments="#", delimiter=",")
print(“显示完整的初始化的数组: \n {} \n”.format (a ))
b = np.genfromtxt(StringIO(str1), comments="#", delimiter="," , skip_header=0, skip_footer=2)
print("忽略掉头三个和末尾5个元素后输出B:\n{} ".format (b ))
c = a[2,1]
print(“输出C:\n{} \n”.format ©)
usecols参数
在某些情况下,我们对数据的所有列不感兴趣,但只有其中的一小部分。我们可以用usecols参数选择要导入的列。该参数接受与要导入的列的索引相对应的单个整数或整数序列。请记住,按照惯例,第一列的索引为0。负整数的行为与常规Python负向索引相同。
例如,如果我们只想导入第一列和最后一列,我们可以使用usecols =(0, -1):
a = np.genfromtxt(StringIO(str1), comments="#", delimiter=",",usecols=[1])
print(“取0行到末尾:\n{} \n”.format ( a ) )
本代码执行结果:
PS C:\Users\ceb\python> & C:/Users/ceb/AppData/Local/Programs/Python/Python38/python.exe c:/Users/ceb/python/test1/numpyIO.py
以逗号为分隔符的例子:\n[[1. 2. 3.]
[4. 5. 6.]]
固定宽度为3的例子
[[ 1. 2. 3.]
[ 4. 5. 67.]
[890. 123. 4.]]
固定宽度分别为4,3,2 的例子
[[1234. 567. 89.]
[ 4. 7. 9.]
[ 4. 567. 9.]]
不自动去掉空格的例子
[[b’1’ b’ abc ’ b’ 2’]
[b’3’ b’ xxx’ b’ 4’]]
加上autostrip参数不自动去掉空格的例子
[[b’1’ b’abc’ b’2’]
[b’3’ b’xxx’ b’4’]]
定义#开头的作为注释行,自动略过,形成数组的例子:
[[1. 2.]
[3. 4.]
[5. 6.]
[7. 8.]
[9. 0.]]
显示完整的初始化的数组:
[[1. 2.]
[3. 4.]
[5. 6.]
[7. 8.]
[9. 0.]]
忽略掉头三个和末尾5个元素后输出B:
[[1. 2.]
[3. 4.]
[5. 6.]]
输出C:
6.0
取0行到末尾:
[2. 4. 6. 8. 0.]