使用numpy.genfromtxt()将-9999作为缺失值

时间:2012-09-05 04:58:33

标签: python numpy genfromtxt

假设我有一个带有内容的愚蠢文本文件:

Year    Recon   Observed
1505    162.38        23      
1506     46.14     -9999      
1507    147.49     -9999      

-9999用于表示缺失值(不要问)。

所以,我应该能够将它读成Numpy数组:

import numpy as np
x = np.genfromtxt("file.txt", dtype = None, names = True, missing_values = -9999)

让我的所有小-9999变成numpy.nan。但是,我明白了:

>>> x
array([(1409, 112.38, 23), (1410, 56.14, -9999), (1411, 145.49, -9999)], 
  dtype=[('Year', '<i8'), ('Recon', '<f8'), ('Observed', '<i8')])

......那不对......

我错过了什么吗?

3 个答案:

答案 0 :(得分:9)

不,你没有做错任何事。使用missing_values参数确实告诉np.genfromtxt相应的值应标记为“缺失/无效”。问题是只有在使用usemask=True参数时才支持处理缺失值(我可能应该在documentation中更清楚,我的错误)。

使用usemask=True,输出是一个屏蔽数组。您可以将其转换为常规ndarray,并使用方法np.nan.filled(np.nan)替换为缺失值。

但请注意:如果您检测到的列具有int dtype且您尝试使用np.nan填充其缺失值,则无法获得预期的结果({{ 1}}仅支持浮点列)。

答案 1 :(得分:2)

尝试:

>>> x = np.genfromtxt("file.txt",names = True, missing_values = "-9999", dtype=None)
>>> x
array([(1505, 162.38, 23), (1506, 46.14, -9999), (1507, 147.49, -9999)], 
      dtype=[('Year', '<i8'), ('Recon', '<f8'), ('Observed', '<i8')])

没有给出正确的答案。所以只是让它成为一个字符串并没有帮助。但是,如果添加了另外的标记usemask=True,则会得到:

>>> x = np.genfromtxt("file.txt",names = True, missing_values = -9999, dtype=None, usemask=True)
>>> x
masked_array(data = [(1505, 162.38, 23) (1506, 46.14, --) (1507, 147.49, --)],
             mask = [(False, False, False) (False, False, True) (False, False, True)],
       fill_value = (999999, 1e+20, 999999),
            dtype = [('Year', '<i8'), ('Recon', '<f8'), ('Observed', '<i8')])  

在MaskedArray中给出了你想要的东西,无论如何它都可以使用。

答案 2 :(得分:-1)

numpy documentation at SciPy表明missing_value应该是一个按照您想要的方式工作的字符串。直接数值似乎被解释为列索引。