Python 3.x 如果不使用';我不知道你需要的最大尺寸是多少?

Python 3.x 如果不使用';我不知道你需要的最大尺寸是多少?,python-3.x,numpy,append,numpy-ndarray,librosa,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,

我在一个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的光谱提取功能所使用的)

所以现在我得到了一个值,我知道它将解释输入文件的最长持续时间。我只需要用这个长度初始化我的数组

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”数组的长度,得到一个pad值。然后用零填充工作数组,使其与all数组的长度相同。最后,它会附加这两个变量(将它们连接在一起),并将其赋给“all”变量

所以。。。。 我的问题是-有没有更有效的方法来做到这一点?


奖金问题-当我100%无法知道所需长度时,我该如何做???

不要在迭代中使用
np.append
;它的效率远远低于列表附加。不要在迭代中使用
np.append
;它的效率远远低于列表附加。
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)