2015-10-29 2 views
0

У меня есть текстовый файл, который, среди других данных, содержит данные о видеDTYPE для целых три поплавки

215 
1 0.0 0.0 0.0 
[...] 
9 -0.4330127018930699 0.2499999999985268 1.0 
10 -0.1366025403783193 -0.03660254037890862 1.0 
11 -0.2499999999985268 -0.4330127018930699 1.0 
12 0.03660254037890862 -0.1366025403783193 1.0 
13 0.4330127018930699 -0.2499999999985268 1.0 
14 0.1366025403783193 0.03660254037890862 1.0 
15 0.2499999999985268 0.4330127018930699 1.0 
[...] 
215 1.0 1.0 1.0 
[...] # some more data, other format 

т.е.

  • целое число, определяющее количество строк данных в come,
  • N строк с целым числом, за которыми следуют три поплавка,
  • некоторые данные, отформатированные по-разному.

Я хотел бы преобразовать эти данные в массив numpy. Поскольку я могу лучше всего получить доступ к файлу с генератором по линиям, вам может понадобиться numpy.fromiter(). Однако я не могу правильно указать тип данных. Это

with open(filename) as f: 
    line = islice(f, 1).next() 
    num_nodes = int(line) 
    points = numpy.fromiter(
     islice(f, num_nodes), 
     dtype=[('idx', int, 1), ('vals', float, 3)], 
     count=num_nodes 
     ) 

делает не работу. Любые намеки?

+1

Я предлагаю 'loadtxt' или' genfromtxt'. С 'dtype = None' они выберут int v float для вас. Или попробуйте 'i, f, f, f' dtype. Ваш dtype также может работать. – hpaulj

+0

Мне сложно работать с методами, требующими дескриптора файла, так как файл содержит много других данных, которые по-разному отформатированы. Вот почему я использую генератор ('islice'). –

+1

'genfromtxt' берет все, что может кормить его по одной линии за раз. Для тестирования я часто использую список строк. Генератор должен работать нормально. – hpaulj

ответ

0

Этот сценарий:

import numpy as np 

txt = b"""7 
9 -0.4330127018930699 0.2499999999985268 1.0 
10 -0.1366025403783193 -0.03660254037890862 1.0 
11 -0.2499999999985268 -0.4330127018930699 1.0 
12 0.03660254037890862 -0.1366025403783193 1.0 
13 0.4330127018930699 -0.2499999999985268 1.0 
14 0.1366025403783193 0.03660254037890862 1.0 
15 0.2499999999985268 0.4330127018930699 1.0 
[...] # some more data, other format 
""" 
dt = np.dtype([('idx', int, 1), ('vals', float, 3)]) 
#dt = np.dtype('i,f,f,f') 
print(dt) 

def gentxt(txt, dt): 
    f = txt.splitlines() 
    line = f[0] 
    num_nodes = int(line) 
    aslice = slice(1,num_nodes+1) 
    # print(f[aslice]) 
    points = np.genfromtxt(
     f[aslice], 
     dtype=dt) 
    return points 

M = gentxt(txt,dt) 
print(repr(M)) 

производит

1304:~/mypy$ python3 stack33406545.py 
[('idx', '<i4'), ('vals', '<f8', (3,))] 
array([(9, [-0.4330127018930699, 0.2499999999985268, 1.0]), 
     (10, [-0.1366025403783193, -0.03660254037890862, 1.0]), 
     (11, [-0.2499999999985268, -0.4330127018930699, 1.0]), 
     (12, [0.03660254037890862, -0.1366025403783193, 1.0]), 
     (13, [0.4330127018930699, -0.2499999999985268, 1.0]), 
     (14, [0.1366025403783193, 0.03660254037890862, 1.0]), 
     (15, [0.2499999999985268, 0.4330127018930699, 1.0])], 
     dtype=[('idx', '<i4'), ('vals', '<f8', (3,))]) 

Я использовал простую нарезку из списка строк текста. Я пытался использовать islice так же, как вы, но решил, что не стоит мое время, чтобы все исправить. Главное - использовать interable, который создает нужные текстовые строки. Неважно, является ли это список, диапазон строк файла или вывод генератора.


fromiter является придирчивым о том, что он принимает. Он должен создать 1d-массив;

список или итератор, который возвращает отдельные строки (ConverTable к простой DTYPE) работа:

In [233]: np.fromiter(['1', '2', '3', '4'],dtype=int) 
Out[233]: array([1, 2, 3, 4]) 

но список списков (2d) не делает:

In [234]: np.fromiter([['1', '2'],['3', '4']],dtype=int) 
.... 
ValueError: setting an array element with a sequence. 

со сложной DTYPE Я дать ему кортежи:

In [236]: np.fromiter([('1', '2'),('3', '4')],dtype=np.dtype('i,i')) 
Out[236]: 
array([(1, 2), (3, 4)], dtype=[('f0', '<i4'), ('f1', '<i4')]) 

строк или кортежей строк с несколькими номерами Безразлично» т работы, ['1 2','3 4'], [('1 2',),('3 4',)]. genfromtxt намного лучше обрабатывает текст с строками и столбцами (csv like).

Смежные вопросы