11

我正在将一些 Matlab 代码传输到 Python。我对 Python 比较陌生,并且不确定 Python 等效于 Matlab 的textscan方法。任何帮助将不胜感激。

4

4 回答 4

7

如果您要将 Matlab 翻译成 Python,我会假设您已经在使用 NumPy。

在这种情况下,您可以使用np.loadtxt(如果没有缺少值)或np.genfromtxt(如果缺少值:我不确定 Matlab 是否textscan可以处理)。

如果您需要更多帮助,请向我们提供更多详细信息!

于 2012-10-29T16:49:19.173 回答
5

将 MATLAB 转换textscan为 Python + NumPy 的示例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)

于 2014-04-13T19:17:29.183 回答
4

你必须寻找 Numpy 和 py2mat。如果我对 textscan() 的理解是正确的,您可以使用open()

于 2012-10-29T16:22:39.163 回答
1

如果您的结果比简单的分隔文本更复杂,例如如果混入了其他无用的文本,那么您可以使用 Numpy 的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将该()结果用作值。您还可以指定更复杂的 dtype,例如让不同的列具有不同的类型,以及指定列名以提供结构化数组。文档中对此进行了介绍。

但是,在处理简单的定界或固定宽度数据时,它比其他方法更复杂。

于 2018-07-17T19:12:59.103 回答