Python 阵列傅里叶变换
我正试图用Python为数组定义傅里叶变换 但是,输出总是一个空数组。你能帮我纠正我的错误吗Python 阵列傅里叶变换,python,arrays,fft,Python,Arrays,Fft,我正试图用Python为数组定义傅里叶变换 但是,输出总是一个空数组。你能帮我纠正我的错误吗 import numpy as np def TF(T): N = len(T) Tr = np.array([]) for k in range(0,N-1): Tl = 0 for l in range(0,N-1): Tk += (T[l])*np.exp((-2j*np.pi*k*l)/N) np.a
import numpy as np
def TF(T):
N = len(T)
Tr = np.array([])
for k in range(0,N-1):
Tl = 0
for l in range(0,N-1):
Tk += (T[l])*np.exp((-2j*np.pi*k*l)/N)
np.append(Tr,Tk)
print('Tr =',Tr)
TF(np.array([2,3,5,7,2,9]))
np.append
工作正常。import numpy as np
def TF(T):
N = len(T)
results = []
for k in range(N): # this goes from 0 to N-1
Tk = 0 # Tk here
for l in range(N): # this goes from 0 to N-1
Tk += (T[l])*np.exp((-2j*np.pi*k*l)/N)
results.append(Tk) # store the result
return np.array(results) # return the results
T = np.array([2, 3, 5, 7, 2, 9])
TF(T)
array([ 28. +0.00000000e+00j, -2.5+2.59807621e+00j,
-0.5+7.79422863e+00j, -10. -2.22329102e-14j,
-0.5-7.79422863e+00j, -2.5-2.59807621e+00j])
在您最初的函数公式中的其他地方有一个错误,我稍微修改了它,使其矢量化,并将其与官方的numpy FFT函数进行了比较:
def TF(T):
N=长度(T)
idx=np.arange(N)
Tr=np.empty(shape=T.shape,dtype=np.complex)
对于idx中的k:
Tr[k]=np.sum(T*np.exp(-2j*np.pi*k*idx)/N)
返回Tr
与np.fft.fft()相比:
x=np.数组([2,3,5,7,2,9])
自定义fft=TF(x)
numpy_fft=np.fft.fft(x)
np.allclose(自定义快速傅立叶变换,numpy快速傅立叶变换)
>>>真的
在对代码执行健全性检查时,请始终对照已知的解决方案进行检查!它将为您节省很多时间:)发布时,它将始终返回None
,您需要在函数末尾添加return
语句。它还引发了一个异常:UnboundLocalError:赋值前引用的局部变量“Tk”
打印显示一个空数组,因此返回语句不是完整的解决方案。通常,在使用NumPy时应避免循环。结果是否与输入的维度不同?从公式中,给出了变换的$k^{th}$分量,函数在范围上迭代$k$(0,N-1]真的没有矢量化的解决方案吗?我们陷入了循环和追加的困境?有多种方法可以做到这一点,但OP没有要求优化版本。相反,OP需要正确的实现。谢谢Alexander此解决方案不正确!最终答案与以前实现的FFT函数不一致。Ed我是在发现OPs代码中的第二个错误后发现的。谢谢你的回答!我的主题的目标是只使用np.exp和np.pi构建FFT。这就是我没有使用任何其他np函数的原因。