4

假设我有一个包含内容的哑文本文件:

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)

并让我所有的小-9999s 变成 numpy.nan。但是,我得到:

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

... 那是不对的...

我错过了什么吗?

4

3 回答 3

11

不,你没有做错任何事。使用该missing_values参数确实np.genfromtxt表明相应的值应标记为“缺失/无效”。问题是,仅当您使用参数时才支持处理缺失值(我可能应该在文档usemask=True中更清楚地说明这一点,我的错)。

usemask=True输出是一个掩码数组。您可以将其转换为常规ndarray,并将缺失值替换np.nan为 method .filled(np.nan)

但是要小心:如果您的列被检测为具有intdtype 并且您尝试用 填充其缺失值np.nan,您将不会得到您所期望的(np.nan仅支持 float 列)。

于 2012-09-05T10:27:49.993 回答
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 中提供了您想要的东西,无论如何它可能对您有用。

于 2012-09-05T05:09:00.800 回答
-1

SciPy的numpy 文档建议 missing_value 应该是一个字符串,可以按照您想要的方式工作。直接数值似乎被解释为列索引。

于 2012-09-05T05:06:19.040 回答