Membaca struktur data matlab ke dalam array numpy

Saya memiliki satu set file MAT yang berisi matlab struct. Struct memiliki banyak array. Saya ingin membuka file dan mentransfer semuanya ke dalam array. Sejauh ini saya telah menulis kode berikut:

import h5py
>>> fs = h5py.File('statistics_VAD.mat','r')
>>> list(fs.keys())
['#refs#', 'data']
>>> 
>>> fs['data'].visititems(lambda n,o:print(n, o))
C <HDF5 dataset "C": shape (100, 1), type "|O">
P <HDF5 dataset "P": shape (100, 1), type "|O">
V <HDF5 dataset "V": shape (100, 1), type "|O">
Wn <HDF5 dataset "Wn": shape (100, 1), type "|O">
X <HDF5 dataset "X": shape (100, 1), type "|O">
a <HDF5 dataset "a": shape (100, 1), type "|O">
dn <HDF5 dataset "dn": shape (100, 1), type "|O">
>>> struArray = fs['data']
>>> print(struArray['P'])
<HDF5 dataset "P": shape (100, 1), type "|O">

Saya tidak tahu cara mentransfer HDF5 dataset "P" ke array numpy. Setiap saran akan dihargai


person Dalek    schedule 28.02.2021    source sumber
comment
Apa yang arr=struArray['P'][:] lakukan?   -  person hpaulj    schedule 28.02.2021
comment
@hpaulj hasilnya >>> arr=struArray['P'][:] >>> arr array([[<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], ....   -  person Dalek    schedule 28.02.2021
comment
'Referensi objek' itu mungkin adalah item dalam grup refs, tapi saya tidak tahu apakah h5py dapat mengambilkannya untuk Anda. scipy.io.loadmat dapat menangani file .mat gaya lama, tetapi meskipun demikian, hasilnya dapat memiliki elemen 'buram'. Tidak semua yang disimpan matlab ke file dapat diterjemahkan ke dalam numpy.   -  person hpaulj    schedule 28.02.2021
comment
@hpaulj karena saya menggunakan baris perintah ini di matlab untuk menyimpan data save( 'statistics_VAD.mat','data', '-v7.3'); Saya mendapatkan kesalahan ini menggunakan scipy.io.loadmat: mat_contents = sio.loadmat(mat_fname) raise NotImplementedError('Please use HDF reader for matlab v7.3 files') NotImplementedError: Please use HDF reader for matlab v7.3 files   -  person Dalek    schedule 28.02.2021
comment
Saya tidak menyarankan Anda menggunakan pembaca itu.   -  person hpaulj    schedule 28.02.2021
comment
@hpaulj, maksud Anda lebih baik saya kembali ke matlab untuk menganalisis data? :)   -  person Dalek    schedule 28.02.2021
comment
Saya tidak tahu apa yang ada di struktur MATLAB Anda. loadmat dapat menangani file yang ditulis dalam gaya pra 7.3 asalkan hanya berisi struct dan sel dengan elemen matriks biasa, meskipun hasilnya mungkin berupa lapisan rumit dari array terstruktur dan tipe objek. SO lain telah menjelajahi file 7.3 dengan tingkat keberhasilan yang berbeda-beda.   -  person hpaulj    schedule 28.02.2021
comment
@hpaulj semua elemen dalam struct Matlab saya adalah array. Bisakah Anda menyarankan SO lain dengan python yang memungkinkan saya menjelajahi dan menggunakan data yang disimpan di matlab?   -  person Dalek    schedule 28.02.2021
comment
Tidak. Anda bisa melakukan pencarian Anda sendiri! Namun hati-hati dengan beberapa postingan lama. MATLAB tampaknya telah mengubah format HDF5 satu kali atau lebih. Saya hanya memiliki Oktaf untuk bereksperimen, dan saya tidak tahu apakah itu mengikuti perubahan MATLAB di area ini.   -  person hpaulj    schedule 28.02.2021
comment
@Dalek, bekerja dengan data Matlab yang disimpan sebagai HDF5 dapat memusingkan, terutama karena Matlab menggunakan banyak referensi objek, dan Anda harus memikirkan sendiri skemanya. Saya membaca komentarnya, dan Anda berada di jalur yang benar. Sejauh ini kita mengetahui fs['data']['P'] adalah array referensi objek berbentuk (100,1). Sebuah objek dapat digunakan untuk mereferensikan objek lain dalam file, atau untuk menampung array bersarang -- array dari array. Apa yang Anda dapatkan jika Anda print (struArray['P'][1,1])? Mengetahui hal ini mungkin membantu menyimpulkan skema tersebut.   -  person kcw78    schedule 01.03.2021
comment
@ kcw78 Saya mendapatkan keluaran ini untuk saran Anda ValueError: Index (1) out of range (0-0) tetapi dengan perintah ini saya mendapatkan >>> print (struArray['P'][1]) [<HDF5 object reference>] .   -  person Dalek    schedule 01.03.2021
comment
Gunakan [0,0] untuk mendapatkan elemen pertama. Bentuknya adalah (100,1)   -  person hpaulj    schedule 01.03.2021
comment
@hpaulj Ini kembali lagi hasil serupa >>> print (struArray['P'][0,0]) <HDF5 object reference>.   -  person Dalek    schedule 01.03.2021
comment
@Dalek maaf atas kesalahan pengindeksan -- saya tidak memperhatikan. Untuk mendapatkan objek yang direferensikan, Anda menggunakannya dengan objek file Anda (mirip dengan nama grup/dataset). Jadi, untuk objek ini: struArray['P'][0,0] objek yang direferensikan adalah fs [ struArray['P'][0,0] ]. Untuk mendemonstrasikan perilaku, saya memberikan sedikit contoh dan memposting sebagai jawaban. (Ini bukan jawaban pasti, tetapi menunjukkan proses yang digunakan untuk mendapatkan objek, lalu membaca data yang direferensikan. Saya juga menambahkan kode untuk referensi wilayah (untuk kelengkapan).   -  person kcw78    schedule 01.03.2021


Jawaban (1)


Kode di bawah ini adalah contoh yang disebutkan dalam komentar saya (dtd 01-03-2021). Ini membuat 2 kumpulan data dari array NumPy, lalu kumpulan data dengan 2 referensi objek, 1 untuk setiap kumpulan data. Ini kemudian menunjukkan cara menggunakan referensi objek untuk mengakses data. Dataset kedua dengan referensi wilayah juga dilakukan untuk kelengkapan.

Perhatikan bagaimana h5f[] digunakan dua kali: bagian dalam mendapatkan objek, dan bagian luar mendapatkan data dari referensi objek. Ini adalah kehalusan yang membuat pengguna baru tertarik pada referensi.

import numpy as np
import h5py

with h5py.File('SO_66410592.h5','w') as h5f :
    # Create 2 datasets using numpy arrays
    arr = np.arange(100).reshape(20,5)
    h5f.create_dataset('array1',data=arr)    
    arr = np.arange(100,0,-1).reshape(20,5)
    h5f.create_dataset('array2',data=arr) 
    
    # Create a dataset of OBJECT references: 
    h5f.create_dataset('O_refs', (10,), dtype=h5py.ref_dtype)
    h5f['O_refs'][0] = h5f['array1'].ref
    print (h5f['O_refs'][0])
    print (h5f[ h5f['O_refs'][0] ])
    print (h5f[ h5f['O_refs'][0] ][0,:])
    h5f['O_refs'][1] = h5f['array2'].ref
    print (h5f['O_refs'][1])
    print (h5f[ h5f['O_refs'][1] ])
    print (h5f[ h5f['O_refs'][1] ][-1,:])

    # Create a dataset of REGION references: 
    h5f.create_dataset('R_refs', (10,), dtype=h5py.regionref_dtype)
    h5f['R_refs'][0] = h5f['array1'].regionref[0,:]
    print (h5f['R_refs'][0])
    print (h5f[ h5f['R_refs'][0] ])    
    print (h5f[ h5f['R_refs'][0] ] [ h5f['R_refs'][0] ]) 
    h5f['R_refs'][1] = h5f['array2'].regionref[-1,:]
    print (h5f['R_refs'][1])
    print (h5f[ h5f['R_refs'][1] ])    
    print (h5f[ h5f['R_refs'][1] ] [ h5f['R_refs'][1] ]) 
person kcw78    schedule 01.03.2021