gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:03 25 4
gpt4 key购买 nike

一位同事留下了一些我想用 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。加载文本。我计划在获得最终代码后立即包含它。

感谢您的帮助!

编辑:我最终得到以下代码,其中我使用正则表达式获取 [] 之间的所有内容,并使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com