运行傅里叶变换代码时出现TypeError: only size-1 arrays can be converted to Python scalars
问题分析与解决
你的代码里有两个关键问题导致了这个TypeError:
- 没正确调用flatten方法:
fft_data.flatten只是获取了方法对象,没有执行 flatten 操作,应该写成fft_data = fft_data.flatten()。如果你的输入sample是多维数组,这一步没做的话,fft_data[i]会是一个数组而非单个复数,后续取real和imag得到的也是数组,平方后还是数组,math.sqrt处理不了数组就会报错。 - 用错了sqrt函数:
math.sqrt只能处理单个Python标量,不能处理numpy数组。应该换成numpy的np.sqrt,它支持对数组进行向量运算。
修正后的代码:
import numpy as np import math def fourier(sample): mag = [] fft_data = np.fft.fft(sample) fft_data = fft_data.flatten() # 调用flatten方法并重新赋值 for i in range(len(fft_data)//2): r = fft_data[i].real**2 j = fft_data[i].imag**2 mag.append(round(np.sqrt(r + j), 2)) # 用np.sqrt替代math.sqrt return mag
另外,还可以用numpy的向量化操作简化循环,效率更高:
import numpy as np def fourier(sample): fft_data = np.fft.fft(sample).flatten() mag = np.sqrt(np.abs(fft_data[:len(fft_data)//2])**2).round(2) return mag.tolist()
这样既避免了循环,也更符合numpy的使用习惯。
内容的提问来源于stack exchange,提问作者lemonke24
相关产品推荐
相关产品推荐

