一位同事留下了一些我想用 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/