Что эквивалентно Matlab 'fscanf' в Python? - PullRequest
4 голосов
/ 23 марта 2011

Функция Matlab fscanf() кажется очень мощной. Есть ли какой-нибудь эквивалент этого в python (или numpy)?

В частности, я хочу прочитать матрицу из файла, но я не хочу перебирать каждую строку, чтобы прочитать матрицу. Что-то в этом роде (из matlab для чтения 2D-матрицы 1000x1000):

matrix = fscanf(fopen('input.txt'),'%d',[1000,1000]); 

Ответы [ 5 ]

5 голосов
/ 23 марта 2011

Python не имеет встроенной функции fscanf. Ближайший способ сделать это - прочитать файл построчно и использовать регулярные выражения.

Numpy (Matlab-подобная библиотека Python), однако, имеет функцию, которая позволяет читать файл и создавать массив из содержимого: numpy.fromfile (или, как предложено в других ответах, numpy.loadtxt может быть более подходящим в этом случае).

3 голосов
/ 23 марта 2011

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

matrix = []
for i in open('input.txt'):
    matrix.append( map(int, i.split()) )

Если вам нужно что-то более сложное (то есть не просто целые числа, разделенные одиночными символами), регулярные выражения могут быть подходящим вариантом.

1 голос
/ 23 марта 2011

Я думаю, что ответ Wookai неверен. Я думаю numpy.loadtxt - это то, что вы ищете.

0 голосов
/ 23 марта 2011

Я думаю, что питонский способ сделать это - открыть файл и прочитать данные в list из list с использованием списочных представлений.

(Я использую данные из строки для ясности и читаю их как из файла, используя StringIO.)

>>> from cStringIO import StringIO
>>> data_file="1 2 3 4 5 6\n7 8 9 10 11 12\n13 14 15 16 17 18\n19 20 21 22 23 24\n"
>>> reader=StringIO(data_file)
>>> array=[map(int, reader.readline().split()) for i in xrange(4)]
>>> array
[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24]]

Как упоминалось в предыдущем ответе, у numpy есть более прямой метод.

0 голосов
/ 23 марта 2011

Вы смотрели на NumPy? - http://www.scipy.org/Download

Кстати, fscanf хранит данные внутри себя в порядке столбцов - так что я не думаю, что будет какой-либо выигрыш в эффективности. http://www.mathworks.com/help/techdoc/ref/fscanf.html

...