Открытие подразделов .mat файла в Python - PullRequest
1 голос
/ 01 мая 2020

Предыстория: я работаю с профессором, чтобы преобразовать несколько сценариев MatLab в python (одновременно изучая python), поэтому я прошу прощения за свою нелюбовь.

Я пытаюсь прочитать файл .mat в python. Вот пример кода, который у меня есть:

import numpy as np
from scipy.io import loadmat

isochrones = loadmat('isochrones.mat')

Теперь этот файл .mat содержит переменную, которая является структурой 1x1, 'iso c'. Внутри этой переменной есть еще две структуры, 'e8' и 'e9'.

У меня возникли проблемы с доступом к подразделам 'e8' и 'e9'. Они заполнены большим количеством переменных 1x1, которые включают больше и так далее.

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

Пока я могу пройти, но застрял после этого. Когда я распечатываю содержимое 'e9', в нем перечислены все значения данных внутри, а также выводится включенный dtype, где можно увидеть файлы внутри переменной 'e9'.

Вот ссылка на диск Google, которая включает файл .mat: https://drive.google.com/open?id=1kpZsHBtWll-HMd28zQ12L8v1ahWClCaM

1 Ответ

2 голосов
/ 01 мая 2020

Я посмотрел на файл .mat:

e8[0][0][0][0][0] соответствует iso c .e8.one: т.е. [[B], [V], [logage]]

e8[0][0][0][0][1] соответствует iso c .e8.two: то есть [[B], [V], [logage]]

e8[0][0][0][0][0][0][0][0] извлечет iso c .e8.one.B т.е. [14.591, ..., -1.415]

e8[0][0][0][0][0][0][0][1] извлечет iso c .e8.one.V т.е. [13.014, ..., -2.990]

e8[0][0][0][0][1][0][0][0] будет извлекать iso c .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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...