【问题标题】:Reading matlab data structure into numpy arrays将matlab数据结构读入numpy数组
【发布时间】:2021-05-30 07:07:07
【问题描述】:

我有一组 MAT 文件,其中包含 ma​​tlab struct。该结构有一堆数组。我想打开文件并将它们全部传输到数组中。到目前为止,我已经编写了以下代码:

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">

我不知道如何将HDF5 dataset "P" 转移到numpy 数组。任何建议将不胜感激

【问题讨论】:

  • arr=struArray['P'][:] 是做什么的?
  • @hpaulj 输出为&gt;&gt;&gt; arr=struArray['P'][:] &gt;&gt;&gt; arr array([[&lt;HDF5 object reference&gt;], [&lt;HDF5 object reference&gt;], [&lt;HDF5 object reference&gt;], [&lt;HDF5 object reference&gt;], [&lt;HDF5 object reference&gt;], [&lt;HDF5 object reference&gt;], ...
  • 那些“对象引用”可能是refs 组中的项目,但我不知道h5py 是否可以为您获取它们。 scipy.io.loadmat 可以处理旧样式的 .mat 文件,但即使在那里,结果也可能包含“不透明”元素。并非 matlab 保存到文件的所有内容都可以翻译成 numpy。
  • @hpaulj 因为我在 matlab 中使用此命令行来保存数据save( 'statistics_VAD.mat','data', '-v7.3'); 我使用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
  • 我不建议你使用那个阅读器。

标签: matlab numpy-ndarray hdf5 h5py


【解决方案1】:

下面的代码是我评论中提到的示例(dtd 2021-03-01)。它从 NumPy 数组创建 2 个数据集,然后是一个具有 2 个对象引用的数据集,每个数据集 1 个。然后它展示了如何使用对象引用来访问数据。为了完整起见,还完成了带有区域参考的第二个数据集。

注意h5f[] 被使用了两次:内部的获取对象,外部的获取对象引用的数据。这是一个微妙之处,会让新用户不了解参考。

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] ]) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多