在Python中打开.mat文件的子部分。

问题描述 投票:1回答:1

背景:我正在与教授合作,将一些MatLab脚本转换到python中(同时学习python)。我正在与一位教授合作,将几个MatLab脚本转换到python中(同时学习python),所以我为我的不熟练感到抱歉。

我正在尝试用python读取一个.mat文件。下面是我的一个示例代码。

import numpy as np
from scipy.io import loadmat

isochrones = loadmat('isochrones.mat')

现在,这个.mat文件包含了一个1x1结构的变量,"isoc"。在这个变量里面还有两个结构,'e8' & 'e9'。

我在进入'e8' & 'e9'子部分时遇到了麻烦。它们充满了更多的1x1变量,包括更多的等等。

isoc = isochrones['isoc']
e8 = isoc['e8']
e9 = isoc['e9']

我能够走到这一步,但是之后我就卡住了。当我打印出'e9'的内容时,它列出了里面所有的数据值,并且还打印出了包含的dtype,可以看到'e9'变量里面的文件。

这里有一个google drive的链接,包括.mat文件。https:/drive.google.comopen?id=1kpZsHBtWll-HMd28zQ12L8v1ahWClCaM。

python matlab scipy
1个回答
2
投票

我看了一下这个.mat文件。

e8[0][0][0][0][0] 对应于isoc.e8. one. [[B], [V], [logage]]

e8[0][0][0][0][1] 对应于isoc.e8.two:即......。[[B], [V], [logage]]

e8[0][0][0][0][0][0][0][0] 将提取isoc.e8.one.B即。[14.591, ..., -1.415]

e8[0][0][0][0][0][0][0][1] 将提取 isoc.e8.one.V 即:即。[13.014, ..., -2.990]

e8[0][0][0][0][1][0][0][0] 将提取isoc.e8.two.B 即可。[14.590, ..., 0.818]

根据@hpaulj所说的,和一点研究加入一个列表,我想出了。

import pandas as pd
from scipy.io import loadmat
import itertools
isochrones = loadmat('isochrones.mat')

isoc = isochrones['isoc']

e8 = isoc['e8']
e9 = isoc['e9']

keys = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

e8_dict = {}
e9_dict = {}
for i in range(len(keys)):
    e8_dict[keys[i]] = [list(itertools.chain.from_iterable(j)) for j in e8[0, 0][0, 0][i][0, 0]]
    e9_dict[keys[i]] = [list(itertools.chain.from_iterable(k)) for k in e9[0, 0][0, 0][i][0, 0]]


e8_df = pd.DataFrame.from_dict(e8_dict, orient='index', columns=['B', 'V', 'logage'])

e9_df = pd.DataFrame.from_dict(e9_dict, orient='index', columns=['B', 'V', 'logage'])

所以,数据为 isoc.e8.one 可以通过 e8_df.loc['one']和的数据 isoc.e8.one.B 可以通过 e8_df.loc['one']['B'] 返回一个B数据的数组。

下图是e8_df的打印输出。

printed output of e8_df

© www.soinside.com 2019 - 2024. All rights reserved.