使用序列python设置数组元素

时间:2013-09-02 16:01:19

标签: python arrays audio numpy

import math
import pylab
from matplotlib.pylab import *
import numpy as np
import scipy.fftpack
from scipy.io.wavfile import read
w = read('c:/users/ggg.wav')
a=np.array(w[1])
l=len(a)
#from __future__ import division
#b=(l/w[0])
b=(float(l)/w[0])
c=b*1000
d=int(c/40)
print d
print l/d
e=l/d
for i in range(0,d):
    k[9]=np.array(a[(i*e)+1:((i+1)*e)])
print k

这是一个用于构建音频信号的python代码。但是,当我执行此代码时,我收到错误“ValueError:设置一个带序列的数组元素。”。我怎样才能避免这个错误?

2 个答案:

答案 0 :(得分:1)

您的代码还有另一个问题我至少可以帮助您:

如果k未定义,则无法指定k [9]。例如:

>>> k[9] = 'test'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'k' is not defined

'k'需要定义为一个数组,需要获得'正确'的索引。您不能直接在其上分配索引。 请参阅以下示例:

>>> k[9]='test'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

>>> k = [None]*10
>>> k[9]='test'
>>> k
[None, None, None, None, None, None, None, None, None, 'test']

答案 1 :(得分:0)

这适用于样本.wav

w = read('ggg.wav')
a = w[1]  # already an array
l=len(a)
b=(float(l)/w[0])
c=b*1000
d=int(c/40)
e=l/d
k = a[:e*d].reshape(d,e)
print k.shape
print k
print ''
k = [[] for i in range(d)]  # initialize python list
for i in range(0,d):
    k[i] = a[(i*e)+1:((i+1)*e)]
for i in k:
    print i
# or
k = np.zeros((d,e-1),dtype='int') # initialize np.array
for i in range(d):
    k[i,:] = a[(i*e)+1:((i+1)*e)]
print k

w[1]已经是一个np.array。我想你希望将a分成块e多久。为此,我截断a并重新整形,生成我的k。您的索引错过a[0]a[e]