【问题标题】:I'd like to create an array from a list, but preserve the NaNs and infs我想从列表中创建一个数组,但保留 NaN 和 infs
【发布时间】:2011-05-13 23:20:45
【问题描述】:

我正在解析一个数据文件,其中包含由 c++ 生成的以空格分隔的文本。一些驱动计算将溢出、下溢或生成 NaN。字符串“1.#INF00”和“1.#IND00”似乎没有被 numpy.array() 消化,返回“invalid literal for 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。 I have found it demonstrated matplotlib 将优雅地处理这些,在数据中留下空白。对于我的“inf”和“ind”来说,这是可以接受的治疗

【问题讨论】:

  • 我在维护的这段代码中遗漏了一个项目。转换为数组是在与转换为数值不同的步骤中发生的,我错过了这个小宝石:float(x) if '.' in x else int(x),所以如果我在实验时更仔细地阅读错误,我会注意到当我 确实 进行替换时,它是转换为整数没有正确消化“inf”。
  • 所以我在那个条件下添加了这个修改:(float(x) if '.' in x or 'nan' in x or 'inf' in x else int(x).

标签: python numpy matplotlib


【解决方案1】:

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

【讨论】:

  • 比我快。不过map(float, vals) 应该会更好。
  • 进行上述更改后,我将 #1​​.#IND00 上的替换更改为“nan”,这很有效。显然没有对“ind”的解释
【解决方案2】:

或者,您也可以致电 numpy.genfromtxt 并使用 missing_values kwarg。

例如将此数据保存为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]])

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 2021-01-14
    • 1970-01-01
    • 2021-07-06
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多