将循环中的输出分配给单个列表或数组

时间:2014-12-25 11:50:19

标签: python loops

我仍然在Python中找到自己的方式所以这个问题可能非常基础: 我试图在python中生成一些余弦波,然后对它们进行傅里叶变换。我写了以下代码:

from pylab import *
from numpy import *
x = linspace(-5,5,100)
t = linspace(0,2000,2001)
w1=cos(2*pi*3*t/2001)
w2=cos(2*pi*10*t/2001)
fourier=0
long(fourier)

Trace = w1+w2
for i in range(1,125,1):
    fourier[i] = sum(cos(2*pi*i*t/2001)*Trace)

print fourier
f=linspace(1,125,125)
plot(f,fourier)
show()

所以不是按频率计算频率值,而是想制作一个循环,将每个频率从1到125,并将输出存储在一个列表中,以便我可以绘制它们。

Python不喜欢这样,并给出了一条消息:

fourier[i] = sum(cos(2*pi*i*t/2001)*Trace)
TypeError: 'int' object does not support item assignment

知道为什么吗?

4 个答案:

答案 0 :(得分:3)

可能是你想要的:

fourier = []

你将它删除为整数,你需要将其作为列表清除。

你的fourior类型是整数,你需要将它作为列表,以便它可以支持索引分配

也从代码中删除long(fourier)

for i in range(1,126):
    fourier[i] = sum(cos(2*pi*i*t/2001)*Trace)

这将为您提供索引错误索引

正确的是:

for i in range(1,126):    # you dont need last option as 1, because range step is one by default
    fourier.append(sum(cos(2*pi*i*t/2001)*Trace))
 OR
    fourier.insert(i,sum(cos(2*pi*i*t/2001)*Trace))

最好使用列表理解,您需要将范围设置为126以匹配f的维度以进行绘图:

fourier = [sum(cos(2*pi*i*t/2001)*Trace) for i in range(1,126)]

答案 1 :(得分:1)

您需要一个数组初始化:fourier=[]

for i in range(1,125):
  fourier.append(sum(cos(2*pi*i*t/2001)*Trace))

答案 2 :(得分:1)

有几种方法可以建立一个对象/数字列表。

最简单的是for循环:

# create a list of squared numbers
squares = []
for item in range(10):
    squares.append(item*item)

这也可以使用“列表理解”来完成:

# produces identical list to the above for loop
squares = [(item * item) for item in range(10)]

最后,您正在使用numpy,这允许对数组执行“向量”操作。以下是上述方形代码的一个简单示例。

例如

numbers = numpy.array(range(10))
# or you could write -- numbers = numpy.arange(10)
squares = numbers * numbers

但是,您也可以进行非常复杂的矢量运算。这使您可以非常轻松地创建傅里叶变换。

indices = array(range(125), ndmin=2).T
arr_fourier =  (cos(2*pi*indices*t/2001)*Trace).sum(axis=1)

请注意,i已被indices取代。将indices乘以t时,我们会创建indices数组的转置,以便最终创建一个二维数组。在过程结束时,您将其中一个轴(在本例中为1)求和,以将2d阵列缩减为长度为125的1d数组。

答案 3 :(得分:0)

from pylab import *
from numpy import *
x = linspace(-5,5,100)
t = linspace(0,2000,2001)
w1=cos(2*pi*3*t/2001)
w2=cos(2*pi*10*t/2001)
fourier=[]
Trace = w1+w2
    for i in range(1,126):
        fourier.append(sum(cos(2*pi*i*t/2001)*Trace))
print fourier
f=linspace(1,125,125)
plot(f,fourier)
show()