我用代码用numpy生成了一个npz文件夹np.savez(outpath + "/data.npz", **keywords)
其中关键字是一个字典,结构为:
"0" : array
"1" : array
[每个数组是一个二维数组,其中包含用speechpy提取的MFCC特征。例如,键0的数组的形状为(518,13)。
这是生成的npz文件夹的文件夹和文件名结构:
data.npz
0.npy
1.npy
由于我必须将npz文件提供给序列模型工具包以在pytorch上构建语音翻译FBK-Fairseq-ST,因此读取npz文件的功能如下:
def reader_npz(path):
with open(path, 'rb') as f:
shape = np.load(f)
for i in range(int(shape[0])):
yield torch.from_numpy(np.load(f))
我必须按照@V的注释中的建议将for i in range(int(shape["0"]))
行修改为for i in range(int(shape[0]))
。 Ayrat,以避免出现关键错误。
问题是,由于我将2D数组赋予TypeError: only size-1 arrays can be converted to Python scalars
,因此会导致int
。
实际上,如果我的.npz文件夹包含100个npy文件,则shape=np.load(f)
将导致一组从shape["0"]
到shape["99"]
的2D数组。
我应该如何将.npy文件保存在.npz文件中,以便使上述FAIR的fairseq脚本中的函数reader_npz(path)
可以读取.npz文件夹?
提前感谢!
[我找到了通过如下修改reader_npz
函数来读取包含.npy文件中的数组的.npz文件夹的方法:
def reader_npz(path):
with open(path, 'rb') as f:
arrays = np.load(f)
for key in arrays:
yield torch.from_numpy(arrays[key])
arrays = np.load(f)
生成文件夹中文件名的列表。由于每个文件都包含一个2D数组,因此arrays[key]
本身就是2D数组,可以通过打印arrays[key]
进行测试:
print(arrays[key])
[[-1.7862251 -0.3740275 0.5878265 ... 0.56670946 0.23715064
0.28952855]
[-2.3202019 -0.3106088 -0.5866199 ... -0.57073885 -1.3251289
-0.05244343]
[-0.88320863 0.04667355 -1.7014104 ... 1.3024858 1.3273206
1.1638638 ]
...
[ 0.4545314 -0.93115485 -1.2533125 ... 0.32433906 0.31202883
0.11585686]
[ 0.04456866 -1.161861 -1.6719444 ... 1.4855083 0.38237372
0.26423842]
[-0.18203917 -0.2660923 -0.66291505 ... -1.3389368 -2.3973744
-0.84333473]]