2012-09-14 31 views
0

我生成使用numpy.genfromtxt像這樣的數據:使用:操作者numpy.void的索引numpy.ndarray(由numy.genfromtxt輸出)

ConvertToDate = lambda s:datetime.strptime(s,"%d/%m/%Y") 
data= numpy.genfromtxt(open("PSECSkew.csv", "rb"), 
         delimiter=',', 
         dtype=[('CalibrationDate', datetime),('Expiry', datetime), ('B0', float), ('B1', float), ('B2', float), ('ATMAdjustment', float)], 
         converters={0: ConvertToDate, 1: ConvertToDate}) 

我現在要提取的最後4個列(每個行,但在一個循環,所以讓我們只考慮一行)分離變量。所以我這樣做:

B0 = data[0][2] 
    B1 = data[0][3] 
    B2 = data[0][4] 
    ATM = data[0][5] 

但如果我能做到這一點(我就像一個普通的2D ndarray例如)我寧願它:

B0, B1, B2, ATM = data[0][2:] 

但是這給了我一個「無效的指數'錯誤。有沒有辦法很好地做到這一點,還是應該堅持4線方法?

回答

5

作爲np.genfromtxt的輸出,您有一個結構化數組,即一個1D數組,其中每行都作爲不同的字段。

如果要訪問某些領域,僅僅通過名字訪問它們:

data["B0"], data["B1"], ... 

您也可以將它們:

data[["B0", "B1]] 

,讓你只用一個「新」結構數組你需要的字段(引用'new',因爲數據沒有被複制,它仍然與你的初始數組相同)。

如果你想要一些特定的 '行',只是做:

data[["B0","B1"]][0] 

,其輸出的第一行。切片和花式索引也是。

所以,你的例子:

B0, B1, B2, ATM = data[["B0","B1","B2","ATMAdjustment"]][0] 

如果您要訪問的行後只有那些字段行,我會建議保存您想第一場全陣列,然後遍歷:

filtered_data = data[["B0","B1","B2","ATMAdjustment"]] 
for row in filtered_data: 
    (B0, B1, B2, ATM) = row 
    do_something 

甚至:

for (B0, B1, B2, ATM) in filtered_data: 
    do_something 
+0

我把你最後的建議,並修改了它這樣的---爲B0,B1,B2,ATMAdjustment數據[ 「B0」 ,「B1」,「B2」,「ATMAdjustmen」]]:---這是可以接受的方式嗎? – Dan

+0

@丹:當然!我編輯瞭解決方案。 –

+0

這個答案在我嘗試對pytables Table.readWhere()函數返回的列進行切片時對我很有用。我沒有意識到什麼是結構化數組(從readWhere()返回的對象的類型是,我沒有意識到它與「結構化數組」相同)。 –