【问题标题】:numpy array input from file来自文件的numpy数组输入
【发布时间】:2016-01-28 23:54:08
【问题描述】:

我正在从列表中的文件中读取行:

import numpy as np

lines = tuple(open('values.txt','r'))
x = np.array([line for line in lines])

values.txt 看起来像:

[1,0,1,0],
[1,0,0,0]

它会抛出一个错误:

valueError: invalid literal for float()

但是,如果我只是将列表分配给x,它就可以正常工作。

如何从 numpy 数组中的文件中获取输入?

【问题讨论】:

  • line 来自文件是一个字符串,而不是一个列表。看看float('[1,0]')会得到什么。

标签: python file numpy io


【解决方案1】:
lines = open('values.txt', 'r')
x = np.array( [  map(float, (l[l.find("[")+1 : l.find("]")].split(",")))
     for l in lines ] )
print x

简要说明:

这将获取文件中的每一行,找到每一侧的括号,并获取括号内的字符串。然后,我们使用逗号作为分隔符将该字符串拆分为一个数组。然后,我们有一个字符串数组,因此我们将 float 函数映射到每个元素,将其转换为浮点数。然后我们使用标准列表推导对每一行执行此操作。

【讨论】:

  • 如果您指定dtype=floatnp.array 将处理map(float...) 步骤:np.array([l[l.find("[")+1 : l.find("]")].split(",") for l in txt ], dtype=float)
【解决方案2】:
import numpy as np
import ast

lines = open('values.txt','r')
x = np.array([ast.literal_eval(line.strip(',\n')) for line in lines])

【讨论】:

  • 为此为每一行构建一个完整的抽象语法树似乎在计算上不必要地昂贵,但对每个人来说都是自己的。
  • 我没有看到 100 万行这样的放缓,如果我的测试中的任何东西似乎稍微快一点,除了额外的导入
  • 耸耸肩。这只是我的猜测。很想看看你的结果,因为我很难相信它比统计显着性的临界值更快。
  • 我推测的依据是错误的。我查了Generalized LR parsing,发现GLR的复杂度是O(n^3)。我错误地认为更高效的解析器(即那些用于为编译器解析代码的解析器)的时间复杂度大于 O(n)——这是错误的。 LALR、LR(1)和LR(k)解析的时间复杂度是O(n),这也是我的“算法”的复杂度。
【解决方案3】:

您可以一次读取整个文件,只需在将literal_eval() 应用于所有行之前添加外部[]

from ast import literal_eval

with open('values.txt') as fobj:
    x = np.array(literal_eval('[{}]'.format(fobj.read())))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多