gpt4 book ai didi

python - “复杂”对象没有属性 '__getitem__'

转载 作者:太空宇宙 更新时间:2023-11-04 09:10:03 26 4
gpt4 key购买 nike

我是 python 的新手,我正在尝试 FFT 的 python 实现。一段时间以来,我一直收到上述错误。我该怎么办?

import numpy
import cmath

def twiddle(r,s):
x = (cmath.exp((2*cmath.pi*1j*s)/r))
return x


def fft(signal):
n = len(signal)
if n==1:
return signal
else:
Feven=fft([signal[k] for k in range(0,n,2)])
Fodd=fft([signal[k] for k in range(1,n,2)])


for l in range (n/2):
F1 = Feven[l] + twiddle(n, -l) * Fodd[l]
F2 = Feven[l] - twiddle(n, -l) * Fodd[l]
return F1+F2

当我为 Feven 和 Fodd 添加打印语句并输入时:

print (fft([4.5, 3.4, 4.7, 3.8, 6.7, 8.0, 4.6, 7.8]))

我得到:

Traceback (most recent call last):
File "FFT.py", line 41, in <module>
print (fft([4.5, 3.4, 4.7, 3.8, 6.7, 8.0, 4.6, 7.8]))
File "FFT.py", line 29, in fft
Feven=fft([signal[k] for k in range(0,n,2)])
File "FFT.py", line 34, in fft
F1 = Feven[l] + twiddler(n, -l) * Fodd[l]
TypeError: 'complex' object has no attribute '__getitem__'

最佳答案

修复错误

问题出在你的线路上

return F1+F2

这会导致 fft立即返回(使用复数 F1 + F2 ),而实际上它应该返回一个列表。我想你的意思是这样的:

def fft(signal):
n = len(signal)
if n==1:
return signal
else:
Feven=fft([signal[k] for k in range(0,n,2)])
Fodd=fft([signal[k] for k in range(1,n,2)])
F1 = [Feven[l] + twiddle(n, -l) * Fodd[l] for l in range (n/2)]
F2 = [Feven[l] - twiddle(n, -l) * Fodd[l] for l in range (n/2)]
return F1+F2

对您代码的其他评论

  1. 代替[signal[k] for k in range(0,n,2)]你可以写signal[0:n:2]使用 Python's slice notation .同样,而不是 [signal[k] for k in range(1,n,2)]你可以写signal[1:n:2] .

  2. 事实上,自n是列表的长度 signal ,您可以省略它,因为这是切片的默认行为。所以你实际上可以写:

    Feven = fft(signal[::2])
    Fodd = fft(signal[1::2])
  3. else: 中包含一些“else”代码是没有意义的条款和一些外面。把它全部放在一个或另一个中。

  4. Fodd数字总是乘以旋转因子,为什么不做一次而不是两次呢?大概是这样的:

    def fft(signal):
    n = len(signal)
    if n == 1:
    return signal
    feven = fft(signal[::2])
    fodd = [twiddle(n, -k) * o for k, o in enumerate(fft(signal[1::2]))]
    f1 = [e + o for e, o in zip(feven, fodd)]
    f2 = [e - o for e, o in zip(feven, fodd)]
    return f1 + f2

关于python - “复杂”对象没有属性 '__getitem__',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com