假设我有一个带有内容的愚蠢文本文件:
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')])
......那不对......
我错过了什么吗?
答案 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应该是一个按照您想要的方式工作的字符串。直接数值似乎被解释为列索引。