我仍然在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
知道为什么吗?
答案 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()