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

有问题的数据是从 .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) 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/

    10-11 19:37