2014-08-27 44 views
1

我要讀以下的二進制文件:無法specyfing結構化的數據類型,在與NumPy

fname = '3B42RT.2014082603.7.bin' 
with open(fname, 'rb') as fi: 

    dt = np.dtype([('>b1',2880),('>i2',(480,1440)),('>i2',(480,1440)),('>b1',(480,1440)),('>i2',(480,1440))]) 

    data = np.fromfile(fi, dtype=dt) 

但是,我得到了以下錯誤消息:

TypeError: data type not understood 

我已經把基於「DT」在以下IDL程序中正確讀取數據:

file = "3B42RT.2014082603.7.bin" 

data = {header: bytarr(2880.0), precip: intarr(1440.0,480.0), precip_error: intarr(1440.0,480.0), $ 
     source_of_estimate: bytarr(1440.0,480.0), precip_uncal: intarr(1440.0,480.0)} 

close, 1 
openr, 1, file 
readu, 1, data 
close, 1 

precip = swap_endian(data.precip) 

print, precip 

我想使用Python正確讀取文件。 我認爲我的代碼中的問題是在NumPy中定義結構化數據類型。有興趣知道是否有人熟悉這類問題。我經歷了以下NumPy文檔,但由於我對Python的一些瞭解,我無法弄清楚它。 http://docs.scipy.org/doc/numpy/user/basics.rec.html#accessing-and-modifying-field-names

+0

如果需要的數據文件,它是在這裏:ftp://trmmopen.gsfc.nasa.gov/pub/merged/3B42RT/3B42RT.2014082603.7.bin.gz – 2014-08-27 14:01:09

回答

0

NumPy dtypes中每個元組的第一個元素必須是字段名稱。試試這個:

np.dtype([ 
    ('field1', '>b1',2880), 
    ('field2', '>i2',(480,1440)), 
    ('field3', '>i2',(480,1440)), 
    ('field4', '>b1',(480,1440)), 
    ('field5', '>i2',(480,1440)), 
    ]) 
+0

謝謝,我會肯定+1獲得15分。順便說一句,我可以把它放在字典的形式,使字段名可以很容易地訪問? – 2014-08-27 14:12:40

+0

一旦你使用這樣的dtype讀取,你會得到一個「結構化數組」(以前稱爲recarray)。這已命名的字段,所以你可以做'數據['field2'] [34] [100]'等 – 2014-08-27 14:14:15

+0

謝謝,接受。 – 2014-08-27 14:19:38