使用 H5py 读取保存为 v7.3 .mat 文件的 Matlab 元胞数组
Reading a Matlab's cell array saved as a v7.3 .mat file with H5py
我在Matlab中将元胞数组保存为.mat文件如下:
test = {'hello'; 'world!'};
save('data.mat', 'test', '-v7.3')
如何使用 H5py 将其导入为 Python 中的字符串列表?
我试过了
f = h5py.File('data.mat', 'r')
print f.get('test')
print f.get('test')[0]
打印出来:
<HDF5 dataset "test": shape (1, 2), type "|O8">
[<HDF5 object reference> <HDF5 object reference>]
如何取消引用它以获取 Python 中的字符串列表 ['hello', 'world!']
?
用 Matlab 编写:
test = {'Hello', 'world!'; 'Good', 'morning'; 'See', 'you!'};
save('data.mat', 'test', '-v7.3') % v7.3 so that it is readable by h5py
读入 Python(适用于任何数字或行或列,但假设每个单元格都是一个字符串):
import h5py
import numpy as np
data = []
with h5py.File("data.mat") as f:
for column in f['test']:
row_data = []
for row_number in range(len(column)):
row_data.append(''.join(map(unichr, f[column[row_number]][:])))
data.append(row_data)
print data
print np.transpose(data)
输出:
[[u'Hello', u'Good', u'See'], [u'world!', u'morning', u'you!']]
[[u'Hello' u'world!']
[u'Good' u'morning']
[u'See' u'you!']]
我知道这是一个老问题。但我找到了一个包来解决这个问题:
它可以通过 pip 安装,并且可以在 python 3.6 上很好地用于 pre 和 post 7.3 matlab 文件。对于旧文件,它根据文档调用 scipy.io.loadmat
。
这个答案应该被视为 Franck Dernoncourt 答案的 补充 ,它完全满足所有包含 'flat' 数据的元胞数组(对于 7.3 版的 mat 文件)可能在上面)。
我遇到过 嵌套数据 的情况(例如,命名元胞数组中有 1 行元胞数组)。我通过执行以下操作设法获得了数据:
# assumption:
# idx_of_interest specifies the index of the cell array we are interested in
# (at the second level)
with h5py.File(file_name) as f:
data_of_interest_reference = f['cell_array_name'][idx_of_interest, 0]
data_of_interest = f[data_of_interest_reference]
这适用于嵌套数据的原因:
如果您查看要在更深层次上检索的数据集的类型,它会显示“h5py.h5r.Reference”。为了实际检索引用指向的数据,您需要提供对文件对象的引用。
我在Matlab中将元胞数组保存为.mat文件如下:
test = {'hello'; 'world!'};
save('data.mat', 'test', '-v7.3')
如何使用 H5py 将其导入为 Python 中的字符串列表?
我试过了
f = h5py.File('data.mat', 'r')
print f.get('test')
print f.get('test')[0]
打印出来:
<HDF5 dataset "test": shape (1, 2), type "|O8">
[<HDF5 object reference> <HDF5 object reference>]
如何取消引用它以获取 Python 中的字符串列表 ['hello', 'world!']
?
用 Matlab 编写:
test = {'Hello', 'world!'; 'Good', 'morning'; 'See', 'you!'};
save('data.mat', 'test', '-v7.3') % v7.3 so that it is readable by h5py
读入 Python(适用于任何数字或行或列,但假设每个单元格都是一个字符串):
import h5py
import numpy as np
data = []
with h5py.File("data.mat") as f:
for column in f['test']:
row_data = []
for row_number in range(len(column)):
row_data.append(''.join(map(unichr, f[column[row_number]][:])))
data.append(row_data)
print data
print np.transpose(data)
输出:
[[u'Hello', u'Good', u'See'], [u'world!', u'morning', u'you!']]
[[u'Hello' u'world!']
[u'Good' u'morning']
[u'See' u'you!']]
我知道这是一个老问题。但我找到了一个包来解决这个问题:
它可以通过 pip 安装,并且可以在 python 3.6 上很好地用于 pre 和 post 7.3 matlab 文件。对于旧文件,它根据文档调用 scipy.io.loadmat
。
这个答案应该被视为 Franck Dernoncourt 答案的 补充 ,它完全满足所有包含 'flat' 数据的元胞数组(对于 7.3 版的 mat 文件)可能在上面)。
我遇到过 嵌套数据 的情况(例如,命名元胞数组中有 1 行元胞数组)。我通过执行以下操作设法获得了数据:
# assumption:
# idx_of_interest specifies the index of the cell array we are interested in
# (at the second level)
with h5py.File(file_name) as f:
data_of_interest_reference = f['cell_array_name'][idx_of_interest, 0]
data_of_interest = f[data_of_interest_reference]
这适用于嵌套数据的原因: 如果您查看要在更深层次上检索的数据集的类型,它会显示“h5py.h5r.Reference”。为了实际检索引用指向的数据,您需要提供对文件对象的引用。