背景:我正在与教授合作,将一些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。
我看了一下这个.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的打印输出。