Python эквивалент Matlab текстов может

Я работаю с переносом кода Matlab в Python. Я относительно новичок в Python и не уверен, что Python эквивалент Matlab's textscan метод. Любая помощь будет принята с благодарностью.

4 ответа

Решение

Если вы переводите Matlab на Python, я предполагаю, что вы уже используете NumPy.

В этом случае вы можете использовать np.loadtxt (если значения не пропущены) или np.genfromtxt (если отсутствуют значения: я не уверен, что Матлаб textscan справится с этим).

Дайте нам еще несколько деталей, если вам нужна дополнительная помощь!

Пример конвертации MATLAB textscan в Python + NumPy's np.loadtxt:

Пусть наш файл данных results.csv содержать:

0.6236,sym2,1,5,10,10
0.6044,sym2,2,5,10,10
0.548,sym2,3,5,10,10
0.6238,sym2,4,5,10,10
0.6411,sym2,5,5,10,10
0.7105,sym2,6,5,10,10
0.6942,sym2,7,5,10,10
0.6625,sym2,8,5,10,10
0.6531,sym2,9,5,10,10

Код Matlab:

fileID = fopen('results.csv');
d = textscan(fileID,'%f %s %d %d %d %d', 'delimiter',',');
fclose(fileID);

Код Python + NumPy:

fd = open('results2.csv','r')    
d = np.loadtxt(fd,
           delimiter=',',
           dtype={'names': ('col1', 'col2', 'col3', 'col4', 'col5', 'col6'),
           'formats': ('float', 'S4', 'i4', 'i4', 'i4', 'i4')})
fd.close()

Для получения дополнительной информации о типах см. Объекты типа данных (dtype).

Вы должны искать Numpy и py2mat. Если мое понимание textcan() верно, вы можете просто использовать open()

Если ваши результаты сложнее, чем простой текст с разделителями, например, если есть другие бесполезные фрагменты текста, то вы можете использовать Numpy's fromregex функция для замены textscan, fromregex позволяет читать на основе регулярного выражения, с группами (части, окруженные ()) как значения.

Например, скажем, у вас есть такие строки:

field1 is 1, field 2 is 5 to 6.6
field1 is 2, field 2 is 7 to 0.1

И вы хотите получить значения чисел (не имена полей):

[[1, 5, 6.6],
 [2, 7, 0.1]]

Ты можешь сделать

data = np.fromregex('temp.txt', r'field1 is ([\d\.]+), field 2 is ([\d\.]+) to ([\d\.]+)', dtype='float')

[\d\.]+ соответствует любому числу, включая десятичные знаки, и () говорит NumPy использовать этот результат в качестве значения. Вы также можете указать более сложные dtypes, такие как разные столбцы разных типов, а также указать имена столбцов, чтобы получить структурированный массив. Это описано в документации.

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

Другие вопросы по тегам