【问题标题】:Setting an array element with a sequence python使用序列python设置数组元素
【发布时间】:2013-09-03 11:34:20
【问题描述】:
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:设置一个带有序列的数组元素。”。我怎样才能避免这个错误?

【问题讨论】:

  • 错误在哪一行?

标签: python arrays audio numpy


【解决方案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']

【讨论】:

  • 真的很抱歉给您带来麻烦。不是k[9],我打错了。实际上我的意思是 k[i]。
  • @santhu 我认为他的意思是你需要创建k。您可以在 for 循环之前通过 k = np.empty(d) 执行此操作。
  • 谢谢 Ophion,我确实是这个意思,但我从未使用过 numpy,所以我不知道它必须以不同的方式完成。 :)
【解决方案2】:

这适用于示例 .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] 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2017-10-04
    相关资源
    最近更新 更多