Использование numty loadtext - PullRequest
2 голосов
/ 01 марта 2012

У меня есть текстовый файл, содержащий 10 столбцов чисел.Я хотел бы создать словарь, в котором первые три числа (из 10 на строку) каждой строки данных можно использовать в качестве ключа для доступа к двум дополнительным числам в столбцах 6 и 7 (в той же строке).Я пытался сделать это с помощью функции numpy.loadtext (в Python 2.7), однако у меня возникают трудности с аргументом dtype?Это правильный подход или есть более простой способ, и если да, то как правильно выложить функцию.

Большое спасибо и, пожалуйста, дайте мне знать, если требуется какое-либо разъяснение

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Для ясности полный пример вышеприведенного (правильного) ответа может выглядеть так:

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

Это может быть очевидно, но обратите внимание: вы перезапишете словарные записи, если у вас есть идентичные элементы в первых трех столбцах более чем одной строки.

1 голос
/ 01 марта 2012

Учитывая формат ваших данных с интервалом в столбцы,

   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])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...