python - 从 .m matlab 文件中声明的矩阵创建 numpy 数组

标签 python matlab matrix numpy

一位同事留下了一些我想用 Numpy 分析的数据文件。

每个文件都是一个 matlab 文件,例如 data.m,并具有以下格式(但有更多的列和行):

values = [-24.92 -23.66 -22.55 ;
-24.77 -23.56 -22.45 ;
-24.54 -23.64 -22.56 ;
];

这是 matlab 使用的典型显式矩阵创建语法。

我的问题是:从这些文件创建 numpy 数组的最实用方法是什么?

我可以考虑“强力”或“快速而肮脏”的解决方案,但如果有一个更直接的解决方案,我宁愿使用它,就像 numpy 甚至另一个模块的标准函数一样。

编辑:我注意到我的文件可能包含 NaN 值,因此我很可能会调整给出的答案以使用 numpy.genfromtxt 而不是 numpy。加载txt。我计划一旦获得最终代码就将其包含在内。

感谢您的帮助!

编辑:我最终得到了以下代码,其中我使用正则表达式获取 [] 之间的所有内容,并使用 genfromtxt 创建一个 numpy 数组以处理 NaN。更短的解决方案可能是使用 fromstring 方法,该方法不需要 StringIO,但这无法处理 NaN,并且我的数据有 NaN :oP

#!/usr/bin/env python
# coding: utf-8

import numpy, re, StringIO

with open('data.m') as f:
    s = re.search('\[(.*)\]', f.read(), re.DOTALL).group(1)
    buf = StringIO.StringIO(s)
    a = numpy.genfromtxt(buf, missing_values='NaN', filling_values=numpy.nan)

最佳答案

这里有几个选项,尽管它们都不是内置的。

您可能无法接受的解决方案

此解决方案可能属于您的“快速而肮脏”类别,但它有助于引导下一个解决方案。

删除values = [,最后一行(];),并全局替换所有;,没有任何内容:

-24.92 -23.66 -22.55 
-24.77 -23.56 -22.45 
-24.54 -23.64 -22.56 

然后就可以使用numpy的loadtxt了,如下所示。

>>> import numpy as np
>>> A = np.loadtxt('data.m')

>>> A
array([[-24.92, -23.66, -22.55],
       [-24.77, -23.56, -22.45],
       [-24.54, -23.64, -22.56]])

您可能认为可以接受的解决方案

在此解决方案中,我们创建了一个方法来将输入数据强制转换为 numpy loadtxt 喜欢的形式(实际上与上面的形式相同)。

import StringIO
import numpy as np

def convert_m(fname):
    with open(fname, 'r') as fin:
        arrstr = fin.read()
    arrstr = arrstr.split('[', 1)[-1] # remove the content up to the first '['
    arrstr = arrstr.rsplit(']', 1)[0] # remove the content after ']'
    arrstr = arrstr.replace(';', '\n') # replace ';' with newline
    return StringIO.StringIO(arrstr)

既然我们已经做到了,请执行以下操作。

>>> np.loadtxt(convert_m('data.m'))
array([[-24.92, -23.66, -22.55],
       [-24.77, -23.56, -22.45],
       [-24.54, -23.64, -22.56]])

关于python - 从 .m matlab 文件中声明的矩阵创建 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923214/

相关文章:

python - 是否有针对 python 的开放搜索解决方案?

python - torch.clamp 中的列相关边界

c++ - 矩阵(行,列)=值

c++ - 如何打印子矩阵?

c - 如何通过在C中用零填充来使矩阵平方

python - 使用 Plotly 和 Choropleth 绘制多边形

python - 将训练数据的四分位数切割应用于测试数据

arrays - 如何在matlab中从数组创建等价类

python - 如何用 Python 解决僵硬的问题?

matlab - "Cut out"基于边缘检测的图像