Чтение строки файла в массив (питонским способом) - PullRequest
3 голосов
/ 02 июня 2011

Я читаю строки из файла, чтобы затем работать с ними. Каждая строка состоит исключительно из чисел с плавающей точкой.

У меня почти все отсортировано, чтобы преобразовать строки в массивы.

Я в основном (псевдонимный код)

 line=file.readlines()
 line=line.split(' ') # Or whatever separator
 array=np.array(line)
 #And then iterate over every value casting them as floats
      newarray[i]=array.float(array[i])

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

Ответы [ 5 ]

7 голосов
/ 02 июня 2011

Быстрый ответ:

arrays = []
for line in open(your_file): # no need to use readlines if you don't want to store them
    # use a list comprehension to build your array on the fly
    new_array = np.array((array.float(i) for i in line.split(' '))) 
    arrays.append(new_array)

Если вы часто обрабатываете данные такого типа, модуль csv поможет.

import csv

arrays = []
# declare the format of you csv file and Python will turn line into
# lists for you 
parser = csv.reader(open(your_file), delimiter=' '))
for l in parser: 
    arrays.append(np.array((array.float(i) for i in l)))

Если вы чувствуете себя диким, вы можете даже сделать это полностью декларативным:

import csv

parser = csv.reader(open(your_file), delimiter=' '))
make_array = lambda row : np.array((array.float(i) for i in row)) 
arrays = [make_array(row) for row in parser]

И если вы действительно хотите, чтобы ваши коллеги ненавидели вас, вы можете сделать один вкладыш (НЕ ПИФОНИЧЕСКИЙ ВСЕ: -):

arrays = [np.array((array.float(i) for i in r)) for r in csv.reader(open(your_file), delimiter=' '))]

Сняв всю плиту котла и его гибкость, вы можете получить чистый и хорошо читаемый вкладыш. Я бы не стал его использовать, потому что мне нравится возможность использовать csv, но это может быть хорошо. Здесь серая зона, поэтому я бы не сказал, что это Pythonic, но она определенно удобна.

arrays = [np.array((array.float(i) for i in l.split())) for l in open(your_file))]
6 голосов
/ 15 июня 2012

Если вам нужен массив NumPy и каждая строка в текстовом файле имеет одинаковое количество значений :

a = numpy.loadtxt('data.txt')

Без NUMPY:

with open('data.txt') as f:
    arrays = list(csv.reader(f, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC))

Или просто :

with open('data.txt') as f:
    arrays = [map(float, line.split()) for line in f]
3 голосов
/ 02 июня 2011

Как насчет следующего:

import numpy as np

arrays = []
for line in open('data.txt'):
  arrays.append(np.array([float(val) for val in line.rstrip('\n').split(' ') if val != '']))
1 голос
/ 15 июня 2012

Один возможный однострочный:

a_list = [map(float, line.split(' ')) for line in a_file]

Обратите внимание, что здесь я использовал map() вместо понимания вложенного списка, чтобы улучшить читаемость.

Если вы хотите массив numpy:

an_array = np.array([map(float, line.split(' ')) for line in a_file])
0 голосов
/ 19 октября 2016

Я хотел бы использовать регулярные выражения

import re

all_lines = ''.join( file.readlines() )

new_array = np.array( re.findall('[\d.E+-]+', all_lines), float)

np.reshape( new_array, (m,n) )

Сначала объединить файлы в одну длинную строку, а затем извлечь только выражения, соответствующие числам с плавающей запятой ( '[\d.E + -] ' для научной записи, но вы также можете использовать ' [\ d.] ' только для выражений с плавающей запятой).

...