在 python 中访问时如何保留 matlab 结构?

Posted

技术标签:

【中文标题】在 python 中访问时如何保留 matlab 结构?【英文标题】:How to preserve matlab struct when accessing in python? 【发布时间】:2012-08-10 21:41:48 【问题描述】:

我有一个使用

访问的 mat 文件
from scipy import io
mat = io.loadmat('example.mat')

从 matlab 中,example.mat 包含以下结构

    >> load example.mat
    >> data1

    data1 =

            LAT: [53x1 double]
            LON: [53x1 double]
            TIME: [53x1 double]
            units: 3x1 cell


    >> data2

    data2 = 

            LAT: [100x1 double]
            LON: [100x1 double]
            TIME: [100x1 double]
            units: 3x1 cell

在 matlab 中,我可以像 data2.LON 等一样简单地访问数据。这在 python 中并不简单。它给了我几个选择,虽然像

mat.clear       mat.get         mat.iteritems   mat.keys        mat.setdefault  mat.viewitems   
mat.copy        mat.has_key     mat.iterkeys    mat.pop         mat.update      mat.viewkeys    
mat.fromkeys    mat.items       mat.itervalues  mat.popitem     mat.values      mat.viewvalues    

是否可以在 python 中保留相同的结构?如果没有,如何最好地访问数据?我正在使用的当前 python 代码很难使用。

谢谢

【问题讨论】:

你能解释一下当你把它加载到python中时它是什么样子的吗? 另外,另一个想法。如果您使用的是 SciPi,您是否尝试过使用 SciPi.loadmat 是的,我试过 loadmat。 python中的输出很难使用。我什至不知道如何在 data1 或 data2 中访问 LON 或 LAT。 @mikeP -- 我猜它可能只是 data1['LAT'] (python) 而不是 data1.LAT (matlab)。 如果您仍然有问题(并且不介意/可以分享),请随意传递一个示例 .mat 文件,我下班回家后会使用它。 【参考方案1】:

找到这个关于matlab struct和python的教程

http://docs.scipy.org/doc/scipy/reference/tutorial/io.html

【讨论】:

这或许还能为您添加一层额外的信息:***.com/questions/1984714/…【参考方案2】:

(!) 对于保存在*.mat 文件中的嵌套结构,有必要检查io.loadmat 输出的字典中的项目是否为Matlab 结构。例如如果在 Matlab 中

>> thisStruct

ans =
      var1: [1x1 struct]
      var2: 3.5

>> thisStruct.var1

ans =
      subvar1: [1x100 double]
      subvar2: [32x233 double]

然后在scipy.io.loadmat nested structures (i.e. dictionaries)中合并使用代码

【讨论】:

【参考方案3】:

当我需要从 MATLAB 将数据加载到 Python 中时,该数据存储在结构数组 strut_1,struct_2 中,我从使用 scipy.io.loadmat 加载的对象中提取键和值列表。然后我可以将它们组装到自己的变量中,或者如果需要,将它们重新打包到字典中。 exec 命令的使用可能不适用于所有情况,但如果您只是尝试处理数据,它会很好地工作。

# Load the data into Python     
D= sio.loadmat('data.mat')

# build a list of keys and values for each entry in the structure
vals = D['results'][0,0] #<-- set the array you want to access. 
keys = D['results'][0,0].dtype.descr

# Assemble the keys and values into variables with the same name as that used in MATLAB
for i in range(len(keys)):
    key = keys[i][0]
    val = np.squeeze(vals[key][0][0])  # squeeze is used to covert matlat (1,n) arrays into numpy (1,) arrays. 
    exec(key + '=val')

【讨论】:

【参考方案4】:

这会将 mat 结构作为字典返回

def _check_keys( dict):
"""
checks if entries in dictionary are mat-objects. If yes
todict is called to change them to nested dictionaries
"""
for key in dict:
    if isinstance(dict[key], sio.matlab.mio5_params.mat_struct):
        dict[key] = _todict(dict[key])
return dict


def _todict(matobj):
    """
    A recursive function which constructs from matobjects nested dictionaries
    """
    dict = 
    for strg in matobj._fieldnames:
        elem = matobj.__dict__[strg]
        if isinstance(elem, sio.matlab.mio5_params.mat_struct):
            dict[strg] = _todict(elem)
        else:
            dict[strg] = elem
    return dict


def loadmat(filename):
    """
    this function should be called instead of direct scipy.io .loadmat
    as it cures the problem of not properly recovering python dictionaries
    from mat files. It calls the function check keys to cure all entries
    which are still mat-objects
    """
    data = sio.loadmat(filename, struct_as_record=False, squeeze_me=True)
    return _check_keys(data)

【讨论】:

以上是关于在 python 中访问时如何保留 matlab 结构?的主要内容,如果未能解决你的问题,请参考以下文章

从 Python 访问 Matlab 时逃避轮询

在 python 中访问包含 matlab 类的 .mat 文件

matlab中如何保留一位小数

matlab如何保留最新的十五个数据

matlab persistent啥意思

MATLAB如何使计算结果保留4位有效数字