Matlab到python:获取Matlab单元数组值



我是matlab和python的新手,需要从matlab单元数组中使用python中的一些值。

我有一个整数的单元数组,在我执行这行代码并打印结果后,我得到这个:

a = loadmat('file.mat')
print a
{'__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011', 'juncForward_c': array([[ [[ [[ ([[30]], **[[91], [87]]**, [[3]], [[2.2455372690184494, 3.6052402625905993, 5.5884470309828833]], [[14.0, 4.0, 15.4]], [[-1, -1, 2]], [[91, 89, 93], [88, 85, 86]], [[500, 500, 5]], [[1, 2, 3]], [[11.133333333333333]], **[[4]]**, [[1]], [[1]], [[1.0], [20.365168528421695]])]]
[[ ([[30]], **[[99], [80]]**, [[3]], [[4.0376480381611373, 2.3561944901923448, 6.0857897473297058]], [[10.0, 15.4, 16.600000000000001]], [[-1, 1, 3]], [[98, 98, 100], [79, 81, 80]], [[500, 6, 33]], [[1, 2, 3]], **[[14]]**, [[2]], [[1]], [[1]], [[2.0], [6.6573267908372973]])]]

,然后继续打印

谁能给我解释一下cell数组是如何排列的?(那么上面有多少个维度?)

然后我有几个问题:1)在这个单元格数组中,有变量"标签"one_answers"坐标"被分配给一个数组/单元格(我不知道哪个是实际使用的术语)-粗体中的值。我想用Python编写来访问这些值。我该怎么做呢?

2)为了测试,我尝试了这个-> juncInfoF = a.get('juncForward_c'),当我尝试打印juninfof时,它打印"None"。为什么会这样呢?我很困惑,因为以前当我尝试这个,它工作。我甚至可以这样写-> print juncInfo[0][9][0][0]。但是现在我甚至不能做上面的任何一个

我想象loadmat('file.mat')返回一个架子类的实例,它继承自dict类。我假设您正在使用scipy.io中的loadmat函数?

from scipy.io import loadmat

scipy文档只提到loadmat()返回一个字典,但我的猜测是,在您的示例中返回的对象a是一个打开的架子文件,并且当aclosed时,您不能再访问其内容,除了手动调用a.close()之外,这可能有几个原因。

为了防止这种情况,在加载这些数据时,首先将所有数据复制到一个真正的字典中:

mat_dict = {}
mat_dict.update(loadmat('file.mat'))

现在您可以检索mat_dict中的所有键和值:

a = mat_dict['juncForward_c']
print(a.shape) # should work now

注意,这是一个有效的解决方案,只要您正在测试并弄清楚mat_dict数据是关于什么的。在你的脚本/模型/函数中,你通常只加载你想要的那一部分,然后显式地关闭这个文件:

f = loadmat('file.mat')
a = f['juncForward_c']
f.close()

我不知道with语句是否有效(shelve还不支持),你必须测试它,但它应该处理关闭,即使在加载a期间抛出异常:

with loadmat('file.mat') as f:
    a = f['juncForward_c']

编辑:从numpy数组的子类添加额外的属性

import numpy as np
class MatArray(np.array):
    def __init__(self, filepath):
        f = loadmat(filepath)
        np.array.__init__(self, f['juncForward_c'])
        self.version = f['__version__']
        self.header = f['__header__']
        f.close() 

那么现在如果你想让你的数组类似于matlab结构,你可以这样做:

>>> a = MatArray('myfile.mat')
>>> a.header
'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Wed Sep 21 15:30:15 2011'
>>> a.shape

如果在您的mat文件中只有带有整数或字符串列表的单元格数组,我为此编写了一个通用代码。例如,在matlab中你可以这样做:

names = cell(1, N);
indices = cell(1, N);
for ind=1:N
    names{ind} = *some_value*;
    indices{ind} = *some_array*;
save('names_and_indices.mat', 'names', 'indices');

您可以在这里找到如何用python读取此mat文件。

最新更新