Skip to main content
 首页 » 编程设计

python之matlab 到 python : get matlab cell array values

2025年05月04日9bhlsheji

我是 matlab 和 python 的新手,需要在 python 中使用来自 matlab 元胞数组的一些值。

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

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]])]] 

然后继续打印。

有人可以向我解释一下元胞数组是如何排列的吗? (那么上面是多少维度?)

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

2) 为了测试,我尝试了这个 -> juncInfoF = a.get('juncForward_c') 当我尝试打印 juncInfoF 时,它打印“无”。为什么会这样?我很困惑,因为以前当我尝试这个时,它有效。我什至可以这样做 -> print juncInfo[0][9][0][0]。但现在我什至无法执行上述任何操作。

请您参考如下方法:

我想loadmat('file.mat')返回 shelve 的实例-class,即继承自dict类。我假设您正在使用 scipy.io 的 loadmat 函数?

from scipy.io import loadmat 

scipy doc只提到loadmat()返回一个字典,但我的猜测是返回的对象a在您的示例中是一个打开的搁置文件,当 a 时您无法再访问其内容是closed ,除了调用 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 

等等