2

我对 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时,它打印'None'。为什么呢?我很困惑,因为之前我尝试过这个,它有效。我什至可以这样做 -> print juncInfo[0][9][0][0]。但现在我什至不能做上述任何事情。

4

2 回答 2

1

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

from scipy.io import loadmat

scipy文档只提到 loadmat() 返回一个字典,但我猜你的示例中返回的对象是一个打开的搁置文件,当isa时你不能再访问它的内容,这可能有几个原因除了调用手动。acloseda.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 语句是否有效(搁置尚不支持它),您必须对其进行测试,但即使在加载过程中抛出异常,它也应该处理关闭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

ETC

于 2011-10-01T17:55:08.343 回答
0

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

于 2016-02-18T17:25:45.507 回答