在Python中打开.mat文件的小节

时间:2020-05-01 19:51:28

标签: python matlab scipy

背景:我正在与一位教授合作,将一些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”变量中的文件。

这是一个包含.mat文件的Google驱动器链接:https://drive.google.com/open?id=1kpZsHBtWll-HMd28zQ12L8v1ahWClCaM

1 个答案:

答案 0 :(得分: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