【问题标题】:Opening subsections of a .mat file in Python在 Python 中打开 .mat 文件的子部分
【发布时间】:2020-05-02 07:21:21
【问题描述】:

背景:我正在与一位教授合作将一些 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

【问题讨论】:

  • isoc 是结构化数组(使用字段名称进行索引)、0d 对象 dtype 数组(使用 item()[()] 进行索引)和二维数组(有些可能是 (1,1 ) 形状)。您只需检查每个级别的dtypeshape 并使用适当的索引。
  • stackoverflow.com/questions/61542500/… 中,我展示了 MATLAB/Octave 结构与 numpy 数组(和字典)的关系。根据 MA​​TLAB 端,numpy 端可能是相当复杂的数组嵌套。

标签: python matlab scipy


【解决方案1】:

我查看了 .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 的打印输出

【讨论】:

  • 零组对应什么?当e8中有9个文件时,为什么会有'e8[0][0][0][0][0]'?
  • 其中一些[0][0] 索引一个(1,1)数组吗?如果是这样,使用[0,0] 语法会更清晰。
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2018-12-18
  • 2014-10-17
  • 1970-01-01
  • 2023-03-15
  • 2012-04-12
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多