2012-03-01 2 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 

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']} 

원래 답 :

genfromtxtdtype 적절한 추측하려고 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

감사합니다. 위와 같이 테스트 데이터를 사용할 때 작동합니다. 던지는 문제는 색인이 유효하지 않다는 것입니다. 내 데이터가 균등하게 간격을 두지 않았고 정수와 부동 소수점이 혼합되어 있고 일부 앞에 음수 기호가 포함되어 있기 때문이라고 생각합니다. 나는 delimiter = None을 사용하여 시도했지만 도움이되지 않습니다. 죄송합니다. 그냥 순진한 사람 일 수도 있습니다. – user1171835

+0

데이터 샘플을 게시하면 다른 접근 방식을 제안 할 수 있습니다. – unutbu

+0

다음은 일부 데이터의 예입니다. http://pastebin.ca/2123461 – user1171835

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])} 

그것은 분명하지만 NB : 하나 이상의 행의 처음 세 열에 동일한 요소가있을 때 사전 항목을 덮어 씁니다.

+0

고마워요. 위와 같이 테스트 데이터를 사용할 때 작동합니다. 던지는 문제는 색인이 유효하지 않다는 것입니다. 내 데이터가 균등하게 간격을 두지 않았고 정수와 부동 소수점이 혼합되어 있고 일부 앞에 음수 기호가 포함되어 있기 때문이라고 생각합니다. 나는 delimiter = None을 사용하여 시도했지만 도움이되지 않습니다. 미안해, 내가 순진하다면. – user1171835