我正在将一些 Matlab 代码传输到 Python。我对 Python 比较陌生,并且不确定 Python 等效于 Matlab 的textscan
方法。任何帮助将不胜感激。
4 回答
如果您要将 Matlab 翻译成 Python,我会假设您已经在使用 NumPy。
在这种情况下,您可以使用np.loadtxt
(如果没有缺少值)或np.genfromtxt
(如果缺少值:我不确定 Matlab 是否textscan
可以处理)。
如果您需要更多帮助,请向我们提供更多详细信息!
将 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)。
你必须寻找 Numpy 和 py2mat。如果我对 textscan() 的理解是正确的,您可以使用open()
如果您的结果比简单的分隔文本更复杂,例如如果混入了其他无用的文本,那么您可以使用 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,例如让不同的列具有不同的类型,以及指定列名以提供结构化数组。文档中对此进行了介绍。
但是,在处理简单的定界或固定宽度数据时,它比其他方法更复杂。