2010-08-17 59 views
0

我通常不會在這些論壇上發佈問題,但我已遍佈整個地方搜索,並且我沒有發現任何有關此問題的信息。將numpy的flatten_dtype與具有標題的結構化dtypes結合使用

我正在使用結構化數組來存儲實驗數據。我使用標題來存儲有關我的字段的信息,在這種情況下是度量單位。當我在我的D型呼叫numpy.lib.io.flatten_dtype(),我得到:

ValueError: too many values to unpack 
File "c:\Python25\Lib\site-packages\numpy\lib\_iotools.py", line 78, in flatten_dtype 
    (typ, _) = ndtype.fields[field] 

我不會很在意,只是numpy.genfromtxt()調用numpy.lib.io.flatten_dtype() ,我需要能夠從文本文件中導入我的數據。

我想知道我是否做錯了什麼。 flatten_dtype()不是用來支持標題的嗎? genfromtxt()有沒有解決方法?

這裏是我的代碼片段:

import numpy 
fname = "C:\\Somefile.txt" 
dtype = numpy.dtype([(("Amps","Current"),"f8"),(("Volts","Voltage"),"f8")]) 
myarray = numpy.genfromtxt(fname,dtype) 

回答

1

這裏是一個可能的解決方法:

由於您的自定義dtype會導致一個問題,提供而不是扁平的D型:

In [77]: arr=np.genfromtxt('a',dtype='f8,f8') 

In [78]: arr 
Out[78]: 
array([(1.0, 2.0), (3.0, 4.0)], 
     dtype=[('f0', '<f8'), ('f1', '<f8')]) 

然後請使用astype轉換爲您想要的dtype

In [79]: arr=np.genfromtxt('a',dtype='f8,f8').astype(dtype) 

In [80]: arr 
Out[80]: 
array([(1.0, 2.0), (3.0, 4.0)], 
     dtype=[(('Amps', 'Current'), '<f8'), (('Volts', 'Voltage'), '<f8')]) 

編輯:另一種方法是猴子補丁numpy.lib.io.flatten_dtype

import numpy 
import numpy.lib.io 
def flatten_dtype(ndtype): 
    """ 
    Unpack a structured data-type. 

    """ 
    names = ndtype.names 
    if names is None: 
     return [ndtype] 
    else: 
     types = [] 
     for field in names: 
      typ_fields = ndtype.fields[field] 
      flat_dt = flatten_dtype(typ_fields[0]) 
      types.extend(flat_dt) 
     return types 
numpy.lib.io.flatten_dtype=flatten_dtype 
+0

謝謝你的解決方法。這對我來說很有用,但總結起來有點難。我做了大量的數據處理工作,並且正在開發一個能夠自動完成我所做的大部分工作的項目。我希望將這些結構化數組用作整個項目的數據容器。不幸的是,我對它的看法越多,這些標題看起來就像是事後想象的那樣,在沒有全力支持的情況下就會變得粗糙。我正在考慮修補有問題的numpy.lib.io.flatten_dtype()。我知道這通常不是很好的做法,但在這種情況下,它似乎是最簡單的路線。有什麼想法嗎? – Emma 2010-08-18 21:58:27

+0

我已經添加了一些代碼,顯示flatten_dtype可以如何修補。我認爲使用猴子補丁可以作爲一個快速解決方案,但當然,將這個bug修正爲numpy會更令人滿意,所以在將來不會有人對此問題感到困擾。 爲此,您可能想要在http://projects.scipy.org/numpy/report上提交一張票,或者在numpy-discussion郵件列表上發佈一個問題(http://scipy.org/Mailing_Lists )。開發人員閱讀該郵件列表,應該能夠給你提供比我更好的建議。如果它是一個錯誤,甚至可能修復它。 – unutbu 2010-08-19 01:43:31

+0

非常感謝,我會那樣做。 – Emma 2010-08-19 18:30:56