Numpy 用h5py存储多维变长数组

Numpy 用h5py存储多维变长数组,numpy,hdf5,h5py,Numpy,Hdf5,H5py,我正尝试使用以下过程将可变长度数组列表存储在HDF文件中: phn_mfccs = [] # Import wav files for waveform in files: phn_mfcc = mfcc(waveform) # produces a variable length multidim array of the shape (x, 13, 1) # Add MFCC and label to dataset # phn_mfc

我正尝试使用以下过程将可变长度数组列表存储在HDF文件中:

phn_mfccs = []

# Import wav files
for waveform in files:
    phn_mfcc = mfcc(waveform) # produces a variable length multidim array of the shape (x, 13, 1)              

    # Add MFCC and label to dataset
    # phn_mfccs has dimension (len(files),)
    # phn_mfccs[i] has variable dimension ([# of frames in ith segment] (variable), 13, 1)
    phn_mfccs.append(phn_mfcc) 

dt = h5py.special_dtype(vlen=np.dtype('float64'))
mfccs_out.create_dataset('phn_mfccs', data=phn_mfccs, dtype=dt)
但是,我的数据类型似乎没有工作——mfccs_out数据集的每个元素都包含一个多维数组,而它只包含一个1D数组。e、 g.如果第一个
phn_-mfcc
I-append最初具有维度
(59,13,1)
mfccs\u out['phn_-mfccs'][0]
具有维度
(59,)
。 我怀疑这是因为我只是在使用一个float64数据类型,而我需要一些其他的东西来创建一个数组数组?但是,如果我没有指定数据集或尝试使用
dtype='O'
,它会抛出一个错误,如“Object dtype'O'没有本地HDF等价物”


理想情况下,我希望
mfccs\u out['phn\u mfccs'][I]
包含我添加到列表
phn\u mfccs

中的第I个
phn\u mfcc
,代码的本质是:

phn_mfccs = []
<loop several layers>
    phn_mfcc = <some sort of array expanded by one dimension>
    phn_mfccs.append(phn_mfcc) 
np.array(phn_-mfccs)
产生什么?形状,数据类型?如果所有元素都是相同形状和数据类型的数组,则会生成更高维的数组。如果它们的形状不同,它将生成一个具有object dtype的1d数组。鉴于错误信息,我怀疑是后者

我已经回答了一些
vlen
问题,但没有做很多工作

我隐约记得
h5
数组的“参差不齐”维度只能是1d。因此,包含不同维度的一维浮点数组的
phn_mfccs
对象数组可能会工作

我可能会想出一个简单的例子。我建议你构造一个更简单的问题,我们可以用它来复制粘贴和实验。我们不需要知道您如何从目录中读取数据。我们只需要了解您试图编写的数组(列表)的内容

2015年关于vlen阵列的帖子

一维不规则阵列示例 如果我试图将2d数组写入
数据集
,我会得到一个错误

OSError: Can't prepare for writing data (Src and dest data spaces have different sizes)

dataset
本身可能是多维的,但是
vlen
对象必须是一个1d浮点数数组。

代码的本质是:

phn_mfccs = []
<loop several layers>
    phn_mfcc = <some sort of array expanded by one dimension>
    phn_mfccs.append(phn_mfcc) 
np.array(phn_-mfccs)
产生什么?形状,数据类型?如果所有元素都是相同形状和数据类型的数组,则会生成更高维的数组。如果它们的形状不同,它将生成一个具有object dtype的1d数组。鉴于错误信息,我怀疑是后者

我已经回答了一些
vlen
问题,但没有做很多工作

我隐约记得
h5
数组的“参差不齐”维度只能是1d。因此,包含不同维度的一维浮点数组的
phn_mfccs
对象数组可能会工作

我可能会想出一个简单的例子。我建议你构造一个更简单的问题,我们可以用它来复制粘贴和实验。我们不需要知道您如何从目录中读取数据。我们只需要了解您试图编写的数组(列表)的内容

2015年关于vlen阵列的帖子

一维不规则阵列示例 如果我试图将2d数组写入
数据集
,我会得到一个错误

OSError: Can't prepare for writing data (Src and dest data spaces have different sizes)

dataset
本身可能是多维的,但是
vlen
对象必须是一个1d浮点数数组。

感谢您清理代码(我将编辑细节,因为正如您提到的,那里有很多无关的东西)
np.array(phn_mfccs)
确实生成了一个带有维度的数据类型“O”的数组([我们附加的次数],)。每个
phn_mfcc
元素都有不同的维度。有没有办法用HDF存储这样的东西?如果我试图在
create_dataset
的参数中明确指定我想要一个dtype='O'的数据集,它会抛出上面提到的错误。外部数组
phn_mfcc
可以是对象dtype,但我认为对象本身需要是1d数组。我来做个实验。那么,它最终是没有希望的吗?你会推荐另一个库来处理这个特定的数据集吗?我可以尝试将数组展平,并在属性或其他数据集中存储某种形状信息。感谢你清理代码(我将编辑细节,因为正如你提到的,那里有很多无关的东西)
np.array(phn_mfccs)
确实生成了一个带有维度的数据类型“O”的数组([我们附加的次数],)。每个
phn_mfcc
元素都有不同的维度。有没有办法用HDF存储这样的东西?如果我试图在
create_dataset
的参数中明确指定我想要一个dtype='O'的数据集,它会抛出上面提到的错误。外部数组
phn_mfcc
可以是对象dtype,但我认为对象本身需要是1d数组。我来做个实验。那么,它最终是没有希望的吗?您会推荐另一个库来处理这个特定的数据集吗?我可以尝试将数组展平,并将某种形状信息存储在属性或其他数据集中。