2016-03-13 6 views
-1

Я пытаюсь прочитать текстовый файл с матрицей и поместить его в списке,Как читать матрицу из текстового файла

но я использую две петли здесь и я хочу, чтобы моя функция будет быстрее,

Так есть лучший способ, чем мой код?

def read_file(path_to_file): 
    mylist=[] 
    for eachLine in open(path_to_file,'rt'): 
     mylist.append([int(eachRow) for eachRow in eachLine.split()]) 
    return mylist 

Обновленный код с NumPy

def read_file(path_to_file): 
file = path_to_file 
list = np.loadtxt(file, skiprows=0) 
print(list) 

я получил сообщение об ошибке ValueError: Wrong number of columns at line 2

Пример txtfile (первая линия, указывающая, сколько строк или столбцов всегда симметрична)

3 
1 2 3 
4 5 6 
7 8 9 
+6

Этот вопрос относится к http://codereview.stackexchange.com, так как вы не сталкиваются никаких проблем – danidee

+1

Is NumPy доступны для вас? [ 'Numpy.loadtxt()'] (http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.loadtxt.html). – Reti43

+0

Да, но я не мог сделать это с numpy, – aol

ответ

1

I не думайте, что вы можете получить гораздо быстрее для чтения файла. Да, у вас есть вложенный цикл и, следовательно, квадратичная сложность, но это для чтения квадратной матрицы , так что это кажется прекрасным. Можно, однако, использовать with, чтобы убедиться, что файл правильно закрыта, и не забудьте пропустить первую строку:

def read1(): 
    with open("data.txt") as f: 
     next(f) 
     return [[int(x) for x in row.split()] for row in f] 

Вы могли использовать numpy.loadtxt с skiprows=1 ...

import numpy as np 
def read2(): 
    return np.loadtxt("data.txt", skiprows=1) 

. .. но это, по-видимому, на самом деле пять раз slower, чем понимание вложенного списка, по крайней мере для этой крошечной матрицы 3x3.

In [10]: %timeit test.read1() 
10000 loops, best of 3: 47.1 us per loop 
In [11]: %timeit test.read2() 
1000 loops, best of 3: 245 us per loop 
+0

Добавление: для больших матриц «накладные расходы» по numpy менее драматичны. Для матрицы целых чисел 100 × 100 'numpy' занимает немного больше времени, но дольше. –

+0

По моему опыту, 'numpy.loadtxt' всегда занимает больше времени, чем минимальное ручное' open' и итерация, потому что 'loadtxt' делает именно это с такими же дополнительными колокольчиками и свистами, которые вам не всегда нужны. Если время чтения/доступа является проблемой, может быть полезно сохранить данные в двоичном формате и использовать ['numpy.memmap'] (http://docs.scipy.org/doc/numpy-1.10.0/reference//numpy.memmap.html) или ['numpy.fromfile'] (http://docs.scipy.org/doc/numpy-1.10.0/ссылки/полученный/numpy.fromfile.html). Я предпочитаю первый, но обязательно используйте 'mode = c' или' mode = r'. –

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