【问题标题】:Python equivalent of Matlab textscanPython 等价于 Matlab textscan
【发布时间】:2012-10-18 23:49:48
【问题描述】:

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

【问题讨论】:

  • 不告诉我们 Matlab 的 textscan() 是做什么的,您可能会限制自己只能从了解 Matlab 和 Python 的人那里获得答案。
  • @kindall MATLAB 的 textscan() 或多或少像 C 语言中的 sscanf
  • @kindall 这是 Matlab 的 textscan() 方法 link 描述的链接,希望对您有所帮助。

标签: python matlab numpy textscan


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】: