【问题标题】:Scipy spectrogram loop errorScipy 频谱图循环错误
【发布时间】:2018-10-31 02:37:57
【问题描述】:

我想每次使用不同的npersegnoverlapnfft 在循环中运行scipy.signal.spectrogram。但是我得到了:

TypeError: 'numpy.float64' 对象不能被解释为整数

这是我写的:

Fs=10e3
data = testData(Fs)
r = []
for i in numpy.linspace(-0.4, 0.4, 9):
    t_step = 0.5+i
    f_step = 0.5-i

    window_length = round(2 * t_step * Fs)
    noverlap = round(t_step * Fs)
    nfft = 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))

其中 testData 是从spectrogram documentation 复制的, Scipy 版本是 1.1.0。

当我使用常量硬编码 t_stepf_step(没有 +/- i)运行相同的代码时,在整个范围内一切都顺利进行。所以这是我的问题:

  1. 为什么它不起作用?
  2. 有没有办法不手动操作?

完整的追溯:

File "/Users/desktop/test.py", line 34, in main window='hanning')
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/spectral.py", line 691, in spectrogram input_length=x.shape[axis])
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/spectral.py", line 1775, in _triage_segments win = get_window(window, nperseg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/scipy/signal/windows/windows.py", line 2106, in get_window return winfunc(*params)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/windows/windows.py", line 786, in hann return general_hamming(M, 0.5, sym)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/windows/windows.py", line 1016, in general_hamming return general_cosine(M, [alpha, 1. - alpha], sym)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/signal/windows/windows.py", line 116, in general_cosine w = np.zeros(M)
TypeError: 'numpy.float64' object cannot be interpreted as an integer

【问题讨论】:

  • 显示完整的回溯(即完整的错误信息)。那里有有用的信息,包括产生错误的行。
  • round 是 Python 内置函数还是 numpy.round?如果您提供可以运行以重现错误的minimal, complete and verifable example,那么有人会更容易帮助您。
  • round 是 Python 内置的函数,否则我会写 numpy.round。我想这样做。您只需要导入 2 个库并从 scipy.signal.spectrogram 文档中复制代码。我怎样才能更好地改进它?

标签: python python-3.x numpy scipy


【解决方案1】:

您对tstepfstep 的计算产生浮点数,但scipy 需要整数。例如,您可以将代码更改为

arr_f, arr_t, fft = signal.spectrogram(data, Fs,
                                     nperseg=window_length.astype(int), 
                                     noverlap=noverlap.astype(int),
                                     nfft=nfft.astype(int),
                                     window='hanning')

scipy 应该可以正常工作。 .astype(int) 只是调整了 numpy 数据类型,所以不是浮点数 2000.0 scipy 接收整数 2000You can find more information about numpy data types in the official documentation.

更好的方法当然是更改您的计算,以便它们立即生成整数。

【讨论】:

  • 这给出了2个问题的答案,谢谢。我把它改成了int(round(x)) 我还是不明白为什么scipy 在没有浮点数循环的情况下工作
猜你喜欢
  • 2017-09-08
  • 2019-01-24
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2021-03-25
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多