Python: ошибка чтения в str из файла MATLAB .mat с использованием h5py и NumPy - PullRequest
0 голосов
/ 13 февраля 2019

У меня проблемы с загрузкой переменных 'str' Et '(Endtime) и' St '(Starttime) из файла MATLAB .mat в Python.

Я хочу такой же вывод, как в MATLAB.Вместо этого у меня были проблемы, пытающиеся решить это.Ниже приведен код и вывод Python.

# Import numpy and h5py to load in .mat files
import numpy as np
import h5py 

# Load in Matlab ('-v7.3') data
fname = 'directory/file.mat'
f = h5py.File(fname,'r') 

# create dictionary for data
data= {"average":np.array(f.get('average')),"median":np.array(f.get('median')), \
             "stdev":np.array(f.get('stdev')),"P10":np.array(f.get('p10')), \
             "P90":np.array(f.get('p90')),"St":np.str(f.get('stime')), \
             "Et":np.str(f.get('etime'))}
# All other variables are arrays

print(data["Et"])

вывод:

<HDF5 dataset "etime": shape (1, 6), type "<u4">

Я хочу, чтобы строка в python была равна строке в MATLAB.Другими словами, я хочу print (data ["Et"]) = '01011212000000', который является датой и временем.

Как я могу решить эту проблему?

Пример данных вMATLAB: example

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

В октаве

>> x = 1:10;
>> y = reshape(1:12, 3,4);
>> et = '0101121200000';
>> xt = 'a string';
>> save -hdf5 testh5.mat x y et xt

В недопустимом сеансе:

In [130]: f = h5py.File('testh5.mat','r')
In [131]: list(f.keys())
Out[131]: ['et', 'x', 'xt', 'y']
In [132]: list(f['y'].keys())
Out[132]: ['type', 'value']
In [133]: f['x/type'].value
Out[133]: b'range'
In [134]: f['y/type'].value
Out[134]: b'matrix'
In [135]: f['y/value'].value
Out[135]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8.,  9.],
       [10., 11., 12.]])
In [136]: f['et/type'].value
Out[136]: b'sq_string'
In [137]: f['et/value'].value
Out[137]: 
array([[48],
       [49],
       [48],
       [49],
       [49],
       [50],
       [49],
       [50],
       [48],
       [48],
       [48],
       [48],
       [48]], dtype=int8)
In [138]: f['et/value'].value.ravel().view('S13')
Out[138]: array([b'0101121200000'], dtype='|S13')
In [139]: f['xt/value'].value.ravel().view('S8')
Out[139]: array([b'a string'], dtype='|S8')
In [140]: f.close()

как импортировать файл .mat-v7.3 с использованием h5py

Открытие файла с помощью h5py и преобразование данных в цифровую матрицу

====

bytes также работает в моем файле

In [220]: bytes(f['xt/value'].value)
Out[220]: b'a string'
In [221]: bytes(f['et/value'].value)
Out[221]: b'0101121200000'
0 голосов
/ 13 февраля 2019

Если вы не возражаете против типа переменных etime и stime, хранящихся в file.mat, и вы можете хранить их как тип char вместо string, вы можете прочитать их в Python следующим образом: bytes(f.get(your_variable).value).decode('utf-8').В вашем случае:

data = {
    "average": np.array(f.get('average')),
    "median": np.array(f.get('median')),
    "stdev": np.array(f.get('stdev')),
    "P10": np.array(f.get('p10')),
    "P90": np.array(f.get('p90')),
    "St": bytes(f.get('stime')[:]).decode('utf-8'),
    "Et": bytes(f.get('etime')[:]).decode('utf-8')
}

Я уверен, что есть также способ чтения типа string, но это может быть самое простое решение.

0 голосов
/ 13 февраля 2019

Когда мне нужно загрузить .mat, я использую scipy, и он отлично работает.Попробуйте это:

import scipy.io
mat = scipy.io.loadmat('fileName.mat')

Я думаю, что это сработает.Удачи.

...