2012-03-01 5 views
2

私は10列の数字の列を含むテキストファイルを持っています。私ができることをしたいのは、データの各行の最初の3つの数字(1行につき10行)を6番目と7番目の列の2つの数字にアクセスするためのキーとして使用できる辞書を作成することです同じ行にある)。私はこれを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の文字列操作ツールを使用するのが最も簡単だと思います

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) 

利回り

:よう splitは、ファイルを解析します
{(-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']} 

オリジナルの答え:このようなdataで、例えば

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

genfromtxtが適切なdtypeを推測しようとするNone原因genfromtxtに設定したパラメータdtypeを、持っています:

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

+0

あなたのデータのサンプルを投稿する可能性があり、我々は別のアプローチを提案することができます。 – unutbu

+0

データの例を次に示します。 http://pastebin.ca/2123461 – user1171835

1

、上記の完全な例に設定されます:

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

:につながるどの

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} 

それは明らかかもしれませんが、NB:複数の行の最初の3つの列に同じ要素がある場合は、辞書の項目を上書きします。

+0

ありがとうございました。上記のようにテストデータを使用すると動作します。スローアップの問題は、インデックスが無効であることです。データが均等に配置されていないため、整数と浮動小数点数が混在していて、その前にマイナス記号が含まれているためです。私はデリミタ=なしを使用してみましたが、これは役に立たないようです。私がちょうどナイーブであれば申し訳ありません – user1171835

関連する問題