Scipy spectrogram循环报错:numpy.float64无法转为整数
解决scipy.signal.spectrogram循环调用时的TypeError问题
1. 报错原因分析
你遇到的TypeError: 'numpy.float64' object cannot be interpreted as an integer,核心问题是参数类型不匹配:
- 你用
numpy.linspace生成的i是numpy浮点类型,后续计算window_length、noverlap、nfft时,round()函数返回的是numpy.float64类型(而非Python原生的int类型)。 scipy.signal.spectrogram及其底层依赖函数(比如回溯里的general_cosine)要求nperseg、noverlap、nfft这些参数必须是整数类型——当你传入浮点类型的"整数"时,底层执行np.zeros(M)创建数组时就会触发错误,因为数组长度必须是整数。
硬编码参数时你直接用了整数,所以没问题;但循环中通过numpy计算得到的是浮点类型的数值,就会触发这个类型错误。
2. 无需手动硬编码的解决方法
只需要把计算得到的参数转换为Python原生整数类型即可,最简单的方式是用int()包裹round()的结果:
修改后的代码如下:
import numpy as np import scipy.signal Fs = 10e3 data = testData(Fs) r = [] for i in np.linspace(-0.4, 0.4, 9): t_step = 0.5 + i f_step = 0.5 - i # 将计算结果转为Python原生int类型 window_length = int(round(2 * t_step * Fs)) noverlap = int(round(t_step * Fs)) nfft = int(round(Fs / f_step)) arr_f, arr_t, fft = scipy.signal.spectrogram( data, Fs, nperseg=window_length, noverlap=noverlap, nfft=nfft, window='hanning' ) r.append((arr_f, arr_t, fft))
额外小提示:可以加个简单检查确保参数是正整数,避免极端情况下出现0或负数(比如f_step过大导致nfft为0),示例:
assert window_length > 0 and isinstance(window_length, int), "window_length必须为正整数"
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

