matlab到python:获取matlab单元格数组值

matlab到python:获取matlab单元格数组值,python,matlab,mat-file,Python,Matlab,Mat File,我对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([

我对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]])]]
打印工作还在继续

有人能给我解释一下电池阵列是如何排列的吗?(那么上面的尺寸是多少?)

然后我有几个问题: 1) 在这个单元格数组中,有一些变量“label”和“coordinates”被分配给一个数组/单元格(我不知道实际使用的是哪个术语)——这些值以粗体显示。我想用Python来访问这些值。我该怎么做呢

(二) 为了测试,我尝试了这个->
juncInfoF=a.get('juncForward_c')
当我尝试打印juncInfoF时,它会打印'None'。为什么会这样?我很困惑,因为以前我尝试这个方法时,它是有效的。我甚至可以这样做->
打印juncInfo[0][9][0][0]
。但是现在我甚至不能做上述任何一项。

我想象
loadmat('file.mat')
返回一个从dict类继承的-class实例。我假设您正在使用scipy.io中的loadmat函数

from scipy.io import loadmat
唯一提到的loadmat()返回一个字典,但我的猜测是,在您的示例中,返回的对象
a
是一个打开的搁置文件,当
a
关闭时,您无法再访问其内容,除了手动调用
a.close()
之外,这可能有多种原因

要防止出现这种情况,请在加载此数据时,首先将所有数据复制到实际字典中:

mat_dict = {}
mat_dict.update(loadmat('file.mat'))
现在,您可以从
mat\u 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数组中创建子类以添加其他属性

因此,如果您希望数组类似于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

etc

如果在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文件。

嘿,雷米!非常感谢您的回答!我还想问字典是否有办法保存原始mat文件存储结构。因为根据编写matfile的人说,她告诉我matfile中的值是根据特定结构存储的。因此,可以使用.label来获取标签值。在使用上面的方法将.mat文件数据加载到python中之后,我是否可以使用python进行此操作?因为我实际上已尝试键入.label,但它不允许我这样做。您可以创建自己的类,并根据加载的dict中的键分配其属性的值。是否尝试了帮助(loadmat)?看来struct_as_record关键字对您来说可能很有趣。否则,发布一个.mat文件的示例。当我使用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文件吗?您是说希望其他键作为numpy数组中的附加属性吗?您可以从numpy arry中进行子类化,并在上面的edt中执行类似操作。好的,我知道了!非常感谢您的支持我必须这样做:a=f['juncForward\u c'][0,0][0,0]['label']。=)
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');