我想从列表中创建一个数组,但保留NaN和infs

时间:2011-05-13 23:20:46

标签: python numpy matplotlib

我正在解析一个包含从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'来说是可以接受的治疗方法

2 个答案:

答案 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]])