Python相当于Matlab文本扫描

时间:2012-10-29 16:12:51

标签: python matlab numpy textscan

我正在将一些Matlab代码转移到Python。我是Python的新手,并且不确定Python等效于Matlab的textscan方法。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分: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()

有关类型的详细信息,请参阅Data type objects (dtype)

答案 2 :(得分:4)

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

答案 3 :(得分:1)

如果结果比简单的带分隔符的文本还要复杂(例如,如果有其他无用的文本混入其中),则可以使用Numpy的fromregex函数替换textscanfromregex使您可以基于正则表达式读入,并使用组(由()包围的部分)作为值。

例如,假设您有这样的行:

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,例如使不同的列具有不同的类型,以及指定列名以提供结构化数组。文档中对此进行了介绍。

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