Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过h5py读取v7.3 mat文件?_Python_Matlab_Hdf5_Mat_H5py - Fatal编程技术网

Python 如何通过h5py读取v7.3 mat文件?

Python 如何通过h5py读取v7.3 mat文件?,python,matlab,hdf5,mat,h5py,Python,Matlab,Hdf5,Mat,H5py,我有一个由matlab创建的结构数组,存储在v7.3格式的mat文件中: struArray = struct('name', {'one', 'two', 'three'}, 'id', {1,2,3}, 'data', {[1:10], [3:9], [0]}) save('test.mat', 'struArray', '-v7.3') 现在我想使用h5py通过python读取此文件: data = h5py

我有一个由matlab创建的结构数组,存储在v7.3格式的mat文件中:

struArray = struct('name', {'one', 'two', 'three'}, 
                   'id', {1,2,3}, 
                   'data', {[1:10], [3:9], [0]})
save('test.mat', 'struArray', '-v7.3')
现在我想使用h5py通过python读取此文件:

data = h5py.File('test.mat')
struArray = data['/struArray']
我不知道如何从
struArray
中逐个获取结构数据:

for index in range(<the size of struArray>):
    elem = <the index th struct in struArray>
    name = <the name of elem>
    id = <the id of elem>
    data = <the data of elem>
范围()中的索引的
:
元素=
姓名=
id=
数据=

我首先启动解释器并在
struarray
上运行
help
。它应该给你足够的信息,让你开始。如果不能做到这一点,您可以通过
打印
来转储任何Python对象的属性,方法是
\uu dict\uu
属性。

很抱歉,但我认为从Matlab外部获取单元格/结构的内容将非常具有挑战性。如果您查看生成的文件(例如使用HDFView),您将看到有大量的交叉引用,并且没有明显的方法继续

如果你坚持使用简单的数值数组,效果会很好。如果您有包含数字数组的小单元格数组,您可以将它们转换为单独的变量(即cellcontents1、cellcontents2等),这些变量通常只有几行,并允许直接保存和加载它们。因此,在您的示例中,我将使用变量
name1、name2、name3、id1、id2、id3…
等保存一个文件


编辑:您在问题中指定了h5py,这就是我的答案,但值得一提的是,使用
scipy.io.loadmat
您应该能够将原始变量转换为numpy等价物(例如对象数组)。

Matlab7.3和h5py确实存在问题。 我的技巧是将
h5py.\u hl.dataset.dataset
类型转换为
numpy
数组。 比如说,

np.array(data['data'])

将解决您在
'data'
字段中遇到的问题

visit
visititems
是查看
h5py
文件整体结构的快速方法:

fs['struArray'].visititems(lambda n,o:print(n, o))
当我在Octave
save-hdf5生成的文件上运行此命令时,我得到:

type <HDF5 dataset "type": shape (), type "|S7">
value <HDF5 group "/struArray/value" (3 members)>
value/data <HDF5 group "/struArray/value/data" (2 members)>
value/data/type <HDF5 dataset "type": shape (), type "|S5">
value/data/value <HDF5 group "/struArray/value/data/value" (4 members)>
value/data/value/_0 <HDF5 group "/struArray/value/data/value/_0" (2 members)>
value/data/value/_0/type <HDF5 dataset "type": shape (), type "|S7">
value/data/value/_0/value <HDF5 dataset "value": shape (10, 1), type "<f8">
value/data/value/_1 <HDF5 group "/struArray/value/data/value/_1" (2 members)>
...
value/data/value/dims <HDF5 dataset "dims": shape (2,), type "<i4">
value/id <HDF5 group "/struArray/value/id" (2 members)>
value/id/type <HDF5 dataset "type": shape (), type "|S5">
value/id/value <HDF5 group "/struArray/value/id/value" (4 members)>
value/id/value/_0 <HDF5 group "/struArray/value/id/value/_0" (2 members)>
...
value/id/value/_2/value <HDF5 dataset "value": shape (), type "<f8">
value/id/value/dims <HDF5 dataset "dims": shape (2,), type "<i4">
value/name <HDF5 group "/struArray/value/name" (2 members)>
...
value/name/value/dims <HDF5 dataset "dims": shape (2,), type "<i4">
产生:

name: struArray
type: b'struct'
name: struArray/value/data
type: b'cell'
name: struArray/value/data/value/_0
type: b'matrix'
[[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]]
name: struArray/value/data/value/_1
type: b'matrix'
[[ 3.  4.  5.  6.  7.  8.  9.]]
name: struArray/value/data/value/_2
type: b'scalar'
0.0
dims: [3 1]
name: struArray/value/id
type: b'cell'
name: struArray/value/id/value/_0
type: b'scalar'
1.0
...
dims: [3 1]
name: struArray/value/name
type: b'cell'
name: struArray/value/name/value/_0
type: b'sq_string'
[[111 110 101]]
...
dims: [3 1]

Matlab7.3文件格式与h5py一起使用并不十分容易。它依赖于HDF5参考,参见

请注意,Matlab将一个数字存储为一个大小为(1,1)的数组,因此最终的
[0,0]
将获得该数字

要读取数组(i)。数据,请执行以下操作:

>>> f[struArray['data'][0, 0]].value
array([[  1.],
       [  2.],
       [  3.],
       [  4.],
       [  5.],
       [  6.],
       [  7.],
       [  8.],
       [  9.],
       [ 10.]])
要读取
struArray(i).name
,必须将整数数组转换为字符串:

>>> f[struArray['name'][0, 0]].value.tobytes()[::2].decode()
'one'
>>> f[struArray['name'][1, 0]].value.tobytes()[::2].decode()
'two'
>>> f[struArray['name'][2, 0]].value.tobytes()[::2].decode()
'three'

无论如何谢谢你!我为这个问题挣扎了几天。我总是得到类似于
的东西,而不是真正的值。但是,
scipy.io.loadmat
对于7.3版格式的mat文件不起作用。只需在现有阵列层的基础上添加另一个阵列层。例如,
array([[,]],dtype=object)
而现有数据的类型为
h5py.\u hl.dataset.dataset
您是否找到了此问题的实际解决方案?我有一个类似的问题,有一个部分解决方案:
>>> f[struArray['id'][0, 0]][0, 0]
1.0
>>> f[struArray['id'][1, 0]][0, 0]
2.0
>>> f[struArray['id'][2, 0]][0, 0]
3.0
>>> f[struArray['data'][0, 0]].value
array([[  1.],
       [  2.],
       [  3.],
       [  4.],
       [  5.],
       [  6.],
       [  7.],
       [  8.],
       [  9.],
       [ 10.]])
>>> f[struArray['name'][0, 0]].value.tobytes()[::2].decode()
'one'
>>> f[struArray['name'][1, 0]].value.tobytes()[::2].decode()
'two'
>>> f[struArray['name'][2, 0]].value.tobytes()[::2].decode()
'three'