python - numpy.genfromtxt- ValueError- Line #(得到 n 列而不是 m)

标签 python numpy genfromtxt

因此,我一直在编写代码以从文件中读取数据集并将其分离出来进行分析。

相关数据是从 .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) 缺失值来填充该行。

想到的选项:

  • 试试 Pandas;它可能会更努力地猜测你的意图

  • 编写您自己的阅读器。 Pandas 已编译; genfromtxt 是普通的 numpy Python。它逐行读取文件,拆分和转换字段,并将列表附加到主列表。它在最后将该列表列表转换为数组。您自己的阅读器应该同样高效。

  • 预处理您的文件以添加缺失值或更改分隔符。 genfromtxt 接受任何输入它的行。因此它适用于字符串列表、生成修改行的文件读取器等。这可能是最简单的。

    def foo(astr): strs=astr.split() 如果 len(strs)<6: 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/

相关文章:

python - 慢慢改变 BigQuery 的查找缓存 - Dataflow Python Streaming SDK

python - Numpy:多维索引。逐行无循环

python - numpy 排列的 2D

python - zip() 是在 numpy 中根据内存组合数组的最有效方法吗?

Python:numpy.genfromtxt - 需要包含无效字符的列名

python - 在 flask 中嵌入 Bokeh 图和数据表

python - Pandas:将多标题列的级别转入行索引

Python - 处理行中不均匀的列

python - 副窗无槽

python - 在字典中连接数组