【问题标题】:Reading a text document with special formatting in to a numpy array将具有特殊格式的文本文档读入 numpy 数组
【发布时间】:2022-01-16 19:49:35
【问题描述】:

我有一个格式如下的文本文件:

((X_value Y_value Z_value) ID)

我想把它读入一个数组,我已经部分能够做到: positions = np.genfromtxt(file, skip_header=N_header_lines, usecols=(1, 2, 3))

但是当 X_value 为负时我遇到了一个问题,这会导致以下结果:

((-X_value Y_value Z_value) ID)

问题在于 Numpy 现在将 "((-X_value" 作为一列读取,并且没有将字符串与浮点数分开。

我希望我能够清楚地表达我的问题。有人知道如何解决这个问题。

【问题讨论】:

  • 我希望看到一个真实的示例文件,而不是() 的“格式”。那些 () 是否在实际文件中,或者它们只是传达某种所需的分组。

标签: python pandas numpy


【解决方案1】:
a = "(( -1 2.0 3.7) 5)"
a = a.replace('(','').replace(')','').split()
result = [float(i) for i in a]
print(result)

输出:

[-1.0, 2.0, 3.7, 5.0]

【讨论】:

    【解决方案2】:

    Willian 的回答很好,但是如果您不想加载文本文件并在此之前对其进行操作,您可以使用以下 1 行 -

    arr = np.genfromtxt('blob.txt', usecols=(1,2,3),converters={i:lambda x: float(x.decode().strip('(').strip(')')) for i in [1,2,3]} )
    

    基本上 genfromtxt 尝试将数据读入字节并将其转换为正确的格式,因此您可以根据需要使用转换器对其进行操作。

    【讨论】:

    • 遗憾的是这似乎不起作用。对于 X 的正值,它返回一个 nan 字符串,可能是因为它看到“((”作为第一列。但是对于负值它确实有效。形成我理解的主要问题是将列计数为:0:(( 1:X_value 2: Y_value 3:Z_value 0: ((-X_value 1:Y_value 2: Z_value 所以它根据X_value前面的符号来计算列数。
    【解决方案3】:

    genfromtxt 用于csv 文件,这些文件具有一致的行和列,一个简单的表。像 () 这样的额外字符可能会搞砸。分隔符也不一致(默认为空白)

    带样本

    In [68]: txt = """(( 1 2 3) xxx)
        ...: (-1 2 3) yyy)
        ...: """
    In [69]: np.genfromtxt(txt.splitlines(), usecols=(1,2,3))
    Out[69]: 
    array([[ 1.,  2., nan],
           [ 2., nan, nan]])
    

    nan 用于无法制成浮点数的字符串。

    没有usecols,我们看到它在每行中获得不同数量的列。

    In [70]: np.genfromtxt(txt.splitlines())
    Traceback (most recent call last):
      File "<ipython-input-70-3a7e73045f73>", line 1, in <module>
        np.genfromtxt(txt.splitlines())
      File "/usr/local/lib/python3.8/dist-packages/numpy/lib/npyio.py", line 2124, in genfromtxt
        raise ValueError(errmsg)
    ValueError: Some errors were detected !
        Line #2 (got 4 columns instead of 5)
    

    这是它对每一行所做的事情:

    In [71]: for row in txt.splitlines():print(row.split())
    ['((', '1', '2', '3)', 'xxx)']
    ['(-1', '2', '3)', 'yyy)']
    

    您需要在将文件传递给genfromtxt 之前清理文件,或者使用您自己的解析来处理您想要的 ()。

    使用干净的文件:

    In [72]: txt = """1 2 3 xxx
        ...: -1 2 3 yyy
        ...: """
    In [73]: np.genfromtxt(txt.splitlines(),usecols=(0,1,2))
    Out[73]: 
    array([[ 1.,  2.,  3.],
           [-1.,  2.,  3.]])
    

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2015-08-20
      • 2013-12-10
      • 2014-09-03
      相关资源
      最近更新 更多