2012-09-05 40 views
2

可以說我有與內容的啞文本文件:-9999與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 s轉換numpy.nan。但是,我得到:

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

...那是不對的......

我缺少的東西?

+2

爲什麼-9999用來表示缺失值? :-) –

回答

9

不,你沒有做錯什麼。使用missing_values參數確實告訴np.genfromtxt相應的值應該被標記爲「缺失/無效」。問題是,只有在使用usemask=True參數時(我可能應該在documentation中更清楚地說明了我的錯誤)才支持處理缺失值。

使用usemask=True時,輸出爲掩碼數組。您可以將其轉換爲常規ndarray,缺省值由np.nan替換爲.filled(np.nan)

要小心,雖然:如果你有一個被檢測爲具有int D型列並嘗試與np.nan,以填補其遺漏值,你不會得到你所期望的(np.nan僅支持浮點列)。

-1

numpy documentation at SciPy表明missing_value應該是一個字符串,以您想要的方式工作。直接的數值似乎被解釋爲列索引。

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,這可能是可用的,你反正想要的東西。