2011-10-01 65 views
2

我对matlab和python很新,需要在matlab单元格数组中使用python中的一些值。matlab to 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时,它打印出'None'。为什么?我很困惑,因为以前当我试过这个,它的工作原理。我甚至可以这样做 - >print juncInfo[0][9][0][0]。但现在我甚至无法做到上述任何一项。

回答

1

我想象一下loadmat('file.mat')返回一个shelve类的实例,它是从dict类继承的。我假设你使用scipy.io的loadmat函数?

from scipy.io import loadmat 

scipy doc只提到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数据的全部内容,就是一个有效的解决方案。在你的脚本/型号/功能,你会tipically加载所需的货架字典的只是一部分,然后明确地关闭文件:

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

我不知道,如果with语句作品(搁置不支持它至今),你将不得不测试它,但它应该处理关闭即使当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 

+0

嘿remi!非常感谢您的回答! 我也想问一下,如果字典会以任何方式保存原始的mat文件存储结构。因为根据将mat文件编码出来的人,她告诉我matfile中的值是根据特定的结构存储的。因此可以使用a.label来获取标签值。 我可以做到这一点使用python后,我已经加载.mat文件数据到python使用上面的方法?因为我实际上尝试过键入a.label,但它不允许我这样做。 – user974666

+0

你可以创建你自己的类,并根据加载的字典中的键来分配它的属性值。你有没有尝试过帮助(loadmat)?看起来struct_as_record关键字可以让你感兴趣。否则,发布一个.mat文件的例子。 – Remi

+0

当我使用scipy.io.loadmat('file.mat')时返回的字典键是('_version _','1.0'),('_header _','MATLAB 5.0 ....'),('juncForward_c' ,array([[[[30.0],[[91.0],[87.0]],[[3.0]],[[2.2454534533.785785,5.4354]],...)]]等) dtype = object)),那么我如何获得ndarray中的属性作为它们的键值返回:juncForward_c?是否可以这样我不能加载.mat文件? – user974666

0

如果你垫文件有与整数或字符串列表只电池阵列,我写的一个通用的代码。 例如,在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'); 

Here你可以找到如何阅读本蟒垫文件。