我正在解析一个包含从c ++生成的空白分隔文本的数据文件。一些驱动计算将溢出,下溢或生成NaN。似乎字符串“1.#INF00”和“1.#IND00”没有被numpy.array()消化,返回“float()的无效文字”错误。我试图做这样的替换:
line = line.replace('1.#INF00','inf')
line = line.replace('1.#IND00','ind')
vals = line.split(' ')
myarray = array(vals)
但是,唉,无济于事。我也试过'nan'和'NaN'。是否有一些字符串我可以替换哪个float()将解释为nan,inf等?也许我需要在一些引用中逃脱?
顺便说一句,你能告诉我matplotlib将如何处理inf? 默认解决方案是在检测到NaN时将其更改为NaN。 I have found it demonstrated matplotlib将优雅地处理这些问题,从而在数据中留下空白。这对我的'inf'和'ind'来说是可以接受的治疗方法
答案 0 :(得分:4)
float('nan')
应返回NaN,float('inf')
应返回无穷大。至少这是他们如何使用我的翻译(CPython 2.7)。在CPython 2.5中,某些平台(尤其是在Windows上)的情况似乎有所不同,但我怀疑你是否使用了这样一个旧版本的Python。
也许问题出在numpy上,但在这种情况下你可以尝试:
line = line.replace('1.#INF00','inf')
line = line.replace('1.#IND00','nan')
vals = line.split(' ')
myarray = array([float(x) for x in vals])
答案 1 :(得分:1)
或者,您只需致电numpy.genfromtxt
并使用missing_values
kwarg。
e.g。将此数据保存为data.txt
:
1 0.2 0.3 1.#INF00
2 0.5 0.6 0.7
3 1.#IND00 0.1 0.2
4 0.4 0.4 0.5
5 0.5 0.5 0.7
你可以这样做(我们需要将注释标识符设置为默认值“#”以外的其他内容),在这种特殊情况下:
import numpy as np
data = np.genfromtxt('data.txt', missing_values=['1.#INF00', '1.#IND00'],
comments='somethingelse')
这会产生:
array([[ 1. , 0.2, 0.3, nan],
[ 2. , 0.5, 0.6, 0.7],
[ 3. , nan, 0.1, 0.2],
[ 4. , 0.4, 0.4, 0.5],
[ 5. , 0.5, 0.5, 0.7]])