在 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 结构?的主要内容,如果未能解决你的问题,请参考以下文章