2012-03-01 39 views
2

我有一個包含10列數字的文本文件。我希望能夠做的是創建一個字典,其中每行數據的前三個數字(每行10行)可以用作一個鍵,以訪問列6和列7中的另外兩個數字(在同一行中)。我一直在嘗試使用numpy.loadtext(在Python 2.7中)函數做到這一點,但是我遇到了困難與dtype參數?這是正確的方法,還是有一個更簡單的方法,如果是這樣,佈局函數的正確方法是什麼。使用numpy loadtext

許多感謝,並請讓我知道如果任何澄清要求

回答

1

鑑於列間隔數據的格式,

1 0 0  617.09  0.00  9.38 l 0.0000E+00 
    2 0 0  7169.00  6978.44  94.10 o 0.1913E-05 
    3 0 0  366.08  371.91  14.06 o 0.6503E-03 
    4 0 0  5948.04  5586.09  52.95 o 0.2804E-05 
    5 0 0  3756.34  3944.63  50.69 o 0.6960E-05 
-11 1 0  147.27  93.02  23.25 o 0.1320E-02 
-10 1 0  -2.31  5.71  9.57 o 0.2533E-02 

我認爲這將是最簡單的只使用Python的字符串操作工具像split解析文件:

def to_float(item): 
    try: 
     return float(item) 
    except ValueError: 
     return item 

def formatter(lines): 
    for line in lines: 
     if not line.strip(): continue 
     yield [to_float(item) for item in line.split()] 

dct = {} 
with open('data') as f: 
    for row in formatter(f): 
     dct[tuple(row[:3])] = row[5:7] 

print(dct) 

產生

{(-11.0, 1.0, 0.0): [23.25, 'o'], (4.0, 0.0, 0.0): [52.95, 'o'], (1.0, 0.0, 0.0): [9.38, 'l'], (-10.0, 1.0, 0.0): [9.57, 'o'], (3.0, 0.0, 0.0): [14.06, 'o'], (5.0, 0.0, 0.0): [50.69, 'o'], (2.0, 0.0, 0.0): [94.1, 'o']} 

原來的答覆:

genfromtxt有一個參數dtype,當其設置爲None原因genfromtxt嘗試猜測適當的dtype

import numpy as np 
arr = np.genfromtxt('data', dtype = None) 
dct = {tuple(row[:3]):row[5:7] for row in arr} 

例如,data這樣:

1 2 3 4 5 6 7 8 9 10 
1 2 4 4 5 6 7 8 9 10 
1 2 5 4 5 6 7 8 9 10 

dct被設置爲

{(1, 2, 5): array([6, 7]), (1, 2, 4): array([6, 7]), (1, 2, 3): array([6, 7])} 
+0

感謝您的支持。當我使用上面的測試數據時,它可以工作。它拋出的問題是索引無效。我認爲這是因爲我的數據不是均勻分佈的,是整數和浮點數的混合物,還有一些數據在它們之前包含一個「 - 」負號。我嘗試使用分隔符=無,但這似乎沒有幫助。對不起,如果我只是天真 – user1171835 2012-03-01 17:15:08

+0

也許發佈您的數據樣本,我們將能夠建議一種不同的方法。 – unutbu 2012-03-01 17:51:42

+0

以下是一些數據的示例: http://pastebin.ca/2123461 – user1171835 2012-03-02 11:06:23

1

爲了清楚起見,上面的(正確的)答案的一個完整的例子可能看起來像:

import numpy as np 
    f = open("data.txt", 'wa') 
    f.write("1 2 3 4 5 6 7 8 9 10\n") 
    f.write("1 2 4 4 5 6 7 8 9 10\n") 
    f.write("1 2 5 4 5 6 7 8 9 10\n") 
    f.close() 
    arr = np.genfromtxt("data.txt", dtype=None) 
    dct = {tuple(row[:3]):row[4:6] for row in arr} 

這將導致:

{(1, 2, 3): array([5, 6]), (1, 2, 4): array([5, 6]), (1, 2, 5): array([5, 6])} 

它可能很明顯,但注意:如果在多行的前三列中有相同的元素,則會覆蓋字典條目。

+0

感謝您的這一點。當我使用上面的測試數據時,它可以工作。它拋出的問題是索引無效。我認爲這是因爲我的數據不是均勻分佈的,是整數和浮點數的混合物,還有一些數據在它們之前包含一個「 - 」負號。我嘗試使用分隔符=無,但這似乎沒有幫助。對不起,如果我只是天真 – user1171835 2012-03-01 17:16:00