как преобразовать много файлов .npz в файлы .mat через l oop, используя python - PullRequest
0 голосов
/ 03 августа 2020

Мне нужно преобразовать много файлов .npz в файл .mat, используя python. мои файлы организованы как datafile_1.npz, datafile_2.npz ... et c Я хочу преобразовать их в файлы datafile_1.mat, datafile_2.mat и т.д. c. Если я написал код, но получаю ошибку AttributeError: 'str 'объект не имеет атрибута' items '... почему я не могу понять эту ошибку. Надеюсь, кто-нибудь поможет.

import numpy as np
import scipy.io
import glob

filpath=glob.glob('./datafile_*.npz')

for file in filpath:
    #data = np.load('file',)
    scipy.io.savemat('filepath'+'.mat', mdict=file)
    print(data)
    
 

1 Ответ

0 голосов
/ 03 августа 2020

С npz, который у меня есть из более раннего SO:

In [491]: data = np.load('test.npz')                                                                 
In [492]: list(data.keys())                                                                          
Out[492]: ['arr_0', 'arr_1', 'arr_2']
In [493]: data['arr_0']                                                                              
Out[493]: 
array([[1., 1., 1.],
       [1., 1., 1.]])
In [494]: data['arr_1']                                                                              
Out[494]: 
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
In [495]: data['arr_2']                                                                              
Out[495]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

data - это объект, подобный dict. Таким образом, его можно передать как параметр mdict в savemat (который также ожидает dict):

In [496]: io.savemat('data.dat', data)         

проверить сохранение:

In [497]: io.loadmat('data.dat')                                                                     
Out[497]: 
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sun Aug  2 17:16:18 2020',
 '__version__': '1.0',
 '__globals__': [],
 'arr_0': array([[1., 1., 1.],
        [1., 1., 1.]]),
 'arr_1': array([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]]),
 'arr_2': array([[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]])}

в качестве альтернативы мы могли бы сделать наш собственный dict

In [498]: io.savemat('data.dat', mdict={'x':data['arr_0'], 'y':data['arr_1']})                       
In [499]: io.loadmat('data.dat')                                                                     
Out[499]: 
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sun Aug  2 17:19:06 2020',
 '__version__': '1.0',
 '__globals__': [],
 'x': array([[1., 1., 1.],
        [1., 1., 1.]]),
 'y': array([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]])}

Ключ в том, чтобы понять, что np.load для npz возвращает dict, из которого мы можем загружать фактические массивы. Это dict не является данными. Точно так же savemat ожидает dict массивов. Поскольку оба работают с dicts, нам не нужно явно загружать массивы.

...