2012-02-20 69 views
2

我正在從IDL轉換爲Python和numpy(有點像Matlab)。這是一個關於處理數據的懸而未決的問題。也許有人可以幫忙。最佳數據結構:字典數組,對象數組?

我的數據通常情況是,我有一個固定的數據類,可能來自電子表格,數據庫等。我試圖弄清楚什麼樣的數據結構最好在Python和numpy中使用。

我知道csv模塊,可以使用csv.DictReader()來讀取電子表格。它逐行讀取並使用電子表格標題中的專有名稱(第一行)製作字典。

f=open(file,'rU') 
dat = csv.DictReader(f) 
i=0 
data=[] # makes an empty list 
i=0 
for row in dat: 
    data.append(row) 
    if i == 0 : 
     keys=row.keys() 
     print "keys" 
     print keys 
     print 
    i=i+1 

f.close() 

首先,這是有點兒大量的代碼讀取一個CSV文件導入詞典和關鍵字的關鍵字的列表。有更快/更好的方法嗎?

但現在,我想知道一個字典數組是否真的是我想要的。我應該製作一組對象並將其作爲一組對象嗎?或者是其他東西?

如果我有我的字典陣,「數據」,我會得到一些「列」像 年齡=([數據DAT [「時代」對於DAT])陣列

那是正確的如何做到這一點?有沒有辦法像「年齡=數據 - >年齡」這樣做會更快?

希望能得到一些指導。謝謝。

+0

你有一個詞典列表,而不是一個字典數組。好像你想要一個普通的舊數組或可能是一個recarray。看看numpy.loadtxt或csv.reader。 – 2012-02-21 02:15:42

回答

0

的陣列做這你就OK了,雖然你的代碼可以很容易變得更簡潔的方式去:

data = list(csv.DictReader(open(file, 'rU'))) 
print "keys", data[0].keys() 
+0

好的。涼。但是,我需要關閉文件,或者如果沒有文件句柄的話,它會自動關閉嗎? – Dave31415 2012-02-20 18:29:37

+1

@ Dave31415:總是使用這個:'打開(file,'rU')作爲the_file:'。縮進你的'dat = csv.DictReader(the_file)'和''with'裏面的所有內容,並保證文件將被關閉。 – 2012-02-20 18:34:47

+1

一旦打開的行被執行,John Z的方法也會關閉該文件。更一般的情況是,當沒有更多的文件對象引用時(或者在with塊的末尾或者調用f.close()時)文件會關閉。 – 2012-02-21 02:06:09

0

我總是對象

+0

有沒有一種快速的方法來自動生成一個csv文件的類,或者你必須通過編寫代碼手動構建它? – Dave31415 2012-02-20 18:50:42

+0

您是否已經簽出:http://docs.python.org/library/csv.html – 2012-02-20 18:54:29

5

如果您正在使用電子表格型工作數據很多,我強烈建議使用pandas,這是一個爲這類事情設計的Python包。你只是做:

pandas.read_csv(file) 

這就給了你一個DataFrame,這的確各種花哨的索引,並且是很好,速度很快。

+0

這是否與numpy很好地相互作用,或者它應該是另一種選擇? – Dave31415 2012-02-20 18:49:04

+1

它建立在numpy之上,所以它們在一起工作得非常好。 – 2012-02-20 20:49:31

2

看到如何你明確提到使用numpy的,可以考慮類似如下:

import numpy as np 
data = np.genfromtxt('data.txt', delimiter=',', names=True) 
print data['item1'] 

或者

import numpy as np 
item1, item2, item3 = np.loadtxt('data.txt', delimiter=',', skiprows=1).T 

data.txt格式是東西沿着這些路線(即逗號分隔)。

item1, item2, item3 
1.0, 2.0, 3.0 
4.0, 5.0, 6.0 
7.0, 8.0, 9.0 

第一個例子使用結構化陣列,而第二個是隻拆包列(從而移調(.T))分成三個變量。