【问题标题】:Generating a 3D numpy array from variably-shaped 2D numpy arrays?从可变形状的 2D numpy 数组生成 3D numpy 数组?
【发布时间】:2018-04-17 18:33:51
【问题描述】:

我正在生成大量 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)

【问题讨论】:

  • 如果您已经尝试过解决问题,请在此处粘贴您的代码 - 这样我们就可以使用。
  • 我在保密协议下不发布我的代码,我不那么头疼不粘贴任何代码。我认为我已经很好地描述了问题的性质。
  • 发布一个 MCVE - stackoverflow.com/help/mcve?
  • 您可以将 np.zeros((128,198)) 数组连接到 (128,2) 数组以创建 (128,200) 数组。

标签: python arrays numpy tensorflow librosa


【解决方案1】:

我无法回答是否适合您的学习者用零填充。但是使用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)

【讨论】:

  • 谢谢!我还发现这会起作用:space = 200 - arr.shape[1]; arr = np.pad(arr, (0, space), 'constant', constant_values=(0,0))
  • 您确定这样做是对的吗?我最终得到了形状(326,200),因为pad 似乎在两个方向上都有填充。我正在使用 numpy 1.14.2
  • np.pad 对于像这样的简单任务可能有点过分了。它允许您在(二维数组的)所有 4 个边上添加值,并且具有多种模式。
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2016-08-23
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多