1

我有一个名为 的列表datas,它来自datas.append(data).

和数组data的大小是29*44100 (29 seconds .wav).

现在我有 903 首波形歌曲。

load 293 into datas(use append() function),

我将它们从列表转换为数组vstack(datas)

并发生错误:ValueError: array is too big.

有没有其他方法可以做同样的事情但不会导致这个错误?

谢谢。

更多代码信息:

rates = []
datas = []
labels = []
count = 0

filepath = glob.glob('*.wav')

for fp in filepath:

    if (count<293):

        count +=1            
        rate, data0 = read(fp)
        data = numpy.asarray(data0,dtype=theano.config.floatX)
        data /= numpy.max(numpy.abs(data),axis=0)#normalize to +1..-1            
        length = data.size     

        for index in range(0,length,44100):

            if (index+44100) < length:

                datas.append(data[index:index+44100])
                labels.append(random.randint(1,5))

train_set = numpy.vstack(datas)
4

1 回答 1

1

我试图通过这段代码重现您的问题:

import numpy as N

datas = []
for i in range(293):
    datas.append( N.random.rand(44100) )        
res = N.vstack(datas)

这对我来说运行良好,也适用于相当大的范围。这对你有用吗?如果是,则问题可能出在其他地方。您可能想用 eg 创建一个大的空数组N.zeros((44100,293))并直接写入数组以避免我在使用大列表时有时会遇到的内存问题:

res = N.zeros((44100,293))
for i in range(293):
    res[:,i] = N.random.rand(44100)

从评论中的讨论编辑

据我了解,数据量不能在 RAM 中彼此相邻分配。有关详细信息,请参阅此线程。您必须以适当的方式对数据进行下采样或切片,以免超出内存。此外,为您的阵列考虑较少的大数据格式,例如int8代替标准的float64.

正如你所提到的,你想做一个线性回归,我想强调一下,线性回归,例如最小二乘法可以处理分段数据。当您改变一组拟合变量时,您将评估每个点的偏差并最终查看偏差总和。您必须编写一个拟合例程,因为它通常应用基于矩阵的方法。这只是在我上班的路上想到的——也许它可以帮助你。

于 2013-10-10T09:29:39.113 回答