因此,我一直在编写代码以从文件中读取数据集并将其分离出来进行分析。
有问题的数据是从 .dat 文件中读取的,如下所示:
14 HO2 O3 OH O2 O2
15 HO2 HO2 H2O2 O2
16 H2O2 OH HO2 H2O
17 O O O2
18 O O2 O3
19 O O3 O2 O2
我写的代码是这样的:
edge_data=np.genfromtxt('Early_earth_reaction.dat', dtype = str,
missing_values=True, filling_values=bool)
计划是我然后运行数据集中的值并从它们构建一个配对列表。
edge_list=[]
for i in range(360):
edge_list.append((edge_data[i,0],edge_data[i,2]))
edge_list.append((edge_data[i,1],edge_data[i,2]))
print edge_data[i,0]
if edge_data[i,3] != None:
edge_list.append((edge_data[i,0],edge_data[i,3]))
edge_list.append((edge_data[i,1],edge_data[i,3]))
if edge_data[i,4]!= None:
edge_list.append((edge_data[i,0],edge_data[i,4]))
edge_list.append((edge_data[i,1,edge_data[i,4]))
但是,在运行它时,我收到错误消息
File "read_early_earth.py", line 52, in main
edge_data=np.genfromtxt('Early_earth_reaction.dat', dtype = str,
usecols=(1,2,3,4,5), missing_values=True, filling_values=bool)
File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 1667,
in genfromtxt
raise ValueError(errmsg)
ValueError: Some errors were detected !
Line #6 (got 4 columns instead of 5)
Line #14 (got 6 columns instead of 5)
Line #17 (got 4 columns instead of 5)
等等等等。据我所知,发生这种情况是因为有些行中并非所有列都包含值,这显然会为循环抛出 numpy。
在 numpy 中是否有解决方法?或者,是否有另一种方法来完成此任务?我知道,更糟的是,我可以折磨一些正则表达式来完成这项工作,但如果可能的话,我更喜欢一种效率更高的方法。
谢谢!
最佳答案
看起来您已经阅读了关于缺失值的 genfromtxt
。它是否说明了分隔符的使用?
我认为它可以用类似的行处理缺失值
'one, 1, 234.4, , ,'
'two, 3, , 4, 5'
但是当分隔符是默认的“空白”时,它不能。阅读一行后的第一步是
strings = line.split(delimiter)
如果
len(strings)
与初始目标不匹配,则对象。显然它不会试图猜测您想用 n-len(strings)
缺失值填充该行。想到的选项:
genfromtxt
是简单的 numpy Python。它逐行读取文件,拆分和转换字段,并将列表附加到主列表。它在最后将该列表列表转换为数组。你自己的读者应该同样高效。 genfromtxt
接受任何输入它的行。所以它适用于字符串列表、产生修改行的文件阅读器等。这可能是最简单的。def foo(astr):
strs=astr.split()
如果 len(strs) strs.extend([b' ']*(6-len(strs)))
返回 b','.join(strs)
使用字符串列表进行模拟(在 Py3 中):
In [139]: txt=b"""14 HO2 O3 OH O2 O2
...: 15 HO2 HO2 H2O2 O2
...: 16 H2O2 OH HO2 H2O
...: 17 O O O2
...: 18 O O2 O3
...: 19 O O3 O2 O2""".splitlines()
In [140]: [foo(l) for l in txt]
Out[140]:
[b'14,HO2,O3,OH,O2,O2',
b'15,HO2,HO2,H2O2,O2, ',
b'16,H2O2,OH,HO2,H2O, ',
b'17,O,O,O2, , ',
b'18,O,O2,O3, , ',
b'19,O,O3,O2,O2, ']
In [141]: np.genfromtxt([foo(l) for l in txt], dtype=None, delimiter=',')
Out[141]:
array([(14, b'HO2', b'O3', b'OH', b'O2', b'O2'),
(15, b'HO2', b'HO2', b'H2O2', b'O2', b''),
(16, b'H2O2', b'OH', b'HO2', b'H2O', b''),
(17, b'O', b'O', b'O2', b' ', b''),
(18, b'O', b'O2', b'O3', b' ', b''),
(19, b'O', b'O3', b'O2', b'O2', b'')],
dtype=[('f0', '<i4'), ('f1', 'S4'), ('f2', 'S3'), ('f3', 'S4'), ('f4', 'S3'), ('f5', 'S2')])
关于python - numpy.genfromtxt- ValueError- Line #(得到 n 列而不是 m),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39499231/