从不同形状的2D numpy数组生成3D numpy数组?

时间:2018-04-17 18:33:51

标签: python arrays numpy tensorflow librosa

我正在生成大量的mel谱图来训练NN进行音素检测。

每个mel谱图(用Python中的librosa.core.melspectrogram生成)表示为2D numpy阵列,其中轴1(矢量的长度)从谱图变为谱图。它们从形状(128,2)到(128,200)不等。

为了生成3D阵列,所有的光谱图必须具有相同的形状,因此我猜测我应该将零添加到短于200的矢量的末尾。然后我可以将它们全部添加到一个Python列表,在其上调用np.array并生成一个3D numpy数组,对吧?

我自己尝试过这个并不成功。感谢所有帮助。

编辑:(已请求代码,这基本上就是我想要做的)

spectrograms = []

for audio_array in all_audio_arrays:
    audio_array, sr = librosa.core.load(audio_file, sr=sample_rate, mono=True)
    melspectrogram = librosa.feature.melspectrogram(y=audio_array, sr=sample_rate, S=None, n_fft=window_size, hop_length=hop_length)
    # melspectrogram is a 2D numpy array
    # the shape could be between (128, 2) and (128, 200)
    spectrograms.append(melspectrogram)

# I want this to be 3D
np.asarray(spectrograms)

1 个答案:

答案 0 :(得分:0)

如果这是一个让学习者用零填充的合适方法,我无法回答。但使用np.concatenate

这样做很容易
import numpy as np

a = np.ones((128,2))
b = np.ones((128,200))

padding = np.zeros((a.shape[0], b.shape[1] - a.shape[1])) #(128, 198)
a = np.concatenate((a, padding), axis=1)

print (a.shape)

>>> (128L, 200L)