当您不知道所需的最大大小时,追加大小不同的numpy数组吗?

时间:2019-12-07 17:27:01

标签: python-3.x numpy append numpy-ndarray librosa

我正在爬行一个WAV文件文件夹,每个文件具有相同的采样率但长度不同。我正在使用Librosa加载它们,并在它们上计算一系列光谱特征。由于持续时间的不同,这导致阵列的大小不同。然后尝试连接所有这些数组失败-显然是因为它们的形状不同,例如:

shape(1,2046)
shape(1,304)
shape(1,154)

所以我要做的是在加载文件之前,我使用librosa获取每个文件的持续时间并将其打包到列表中。

class GetDurations:

def __init__(self, files, samplerate):
    list = []
    self.files = files
    self.sampleRate = samplerate
    for file in self.files:
        list.append(librosa.get_duration(filename=file, sr=44100))

    self.maxFileDuration = np.max(list)

然后我得到列表的最大值,以获取数组的最大可能长度,并将其转换为帧(这是Librosa的光谱提取功能所使用的)

        self.maxDurationInFrames = librosa.time_to_frames(self.getDur.maxFileDuration,
                                                      sr=44100,hop_length=512) + 1

因此,现在有了一个我知道将占我输入文件最长持续时间的值。我只需要用这个长度初始化数组即可。

allSpectralCentroid = np.zeros((1, self.maxDurationInFrames))[1:]

这为我提供了一个空容器,用于存放目录中所有WAV文件的所有提取的光谱质心数据。为了向该数组添加数据,我稍后将执行以下操作:

padValue = allSpectralCentroid.shape[1] - workingSpectralCentroid.shape[1]
workingSpectralCentroid = np.pad(workingSpectralCentroid[0], ((0, padValue)), mode='constant')[np.newaxis]
allSpectralCentroid = np.append(allSpectralCentroid, workingSpectralCentroid, axis=0)

这将从“ all”数组中减去“ working”数组的长度,以获取填充值。然后用零填充工作数组,使其长度与全部数组相同。最后,它随后将两者附加在一起(将它们连接在一起),并将其分配给“ all”变量。

所以... 我的问题是-有更有效的方法吗?

奖金问题-当我100%无法知道所需的长度时该怎么办?

0 个答案:

没有答案