NumPy FFT 元组索引超出范围?

Posted

技术标签:

【中文标题】NumPy FFT 元组索引超出范围?【英文标题】:NumPy FFT tuple index out of range? 【发布时间】:2015-06-24 17:05:20 【问题描述】:

上周我运行 ffts 没问题,现在我遇到了一些奇怪的错误:

Traceback (most recent call last):
  File "call.py", line 52, in <module>
    main()
  File "call.py", line 50, in main
    validate(temp_path)
  File "call.py", line 35, in validate
    ivr_wav = IVR_Wav(validate_path)
  File "call.py", line 42, in __init__
    self.fft = get_fft(temp_wav_path)
  File "call.py", line 21, in get_fft
    return numpy.fft.fft(frames)
  File "/usr/lib/python2.7/dist-packages/numpy/fft/fftpack.py", line 174, in fft
    return _raw_fft(a, n, axis, fftpack.cffti, fftpack.cfftf, _fft_cache)
  File "/usr/lib/python2.7/dist-packages/numpy/fft/fftpack.py", line 50, in _raw_fft
    n = a.shape[axis]
IndexError: tuple index out of range

我的代码是:

def get_fft(fft_path):
    wav = wave.open(fft_path, 'r')
    frames = wav.readframes(wav.getnframes())
    wav.close()
    return numpy.fft.fft(frames)

NumPy 代码是:

def _raw_fft(a, n=None, axis=-1, init_function=fftpack.cffti,work_function=fftpack.cfftf, fft_cache = _fft_cache ):
    a = asarray(a)
    if n is None:
         n = a.shape[axis]
    if n < 1:
         raise ValueError("Invalid number of FFT data points (%d) specified." % n)

-1 超出了元组的范围是有道理的,但我该如何补救呢?我不太清楚,但我相信调用numpy.fft.fft(path, axis=0) 应该允许n=a.shape[axis] 执行,但这会将n 设置为样本中的长度吗?这甚至是正确的吗?我对 numpy 和 nd-arrays 不是很熟悉。

【问题讨论】:

【参考方案1】:

问题不在于您的 FFT,而在于 readFrames 命令。 wav.readFrames 返回 Bytes 作为输出,它们绝对不是 Numpy FFT 需要的数组。

看看这里:

What is returned by wave.readframes?

我怀疑你认为它的行为类似于 MATLAB waveRead 命令,它返回一个浮点数组,但这里的情况似乎并非如此。

编辑:我通过使用 map() 命令让它工作。

waveform = map(ord, list(frames))
plt.plot(np.fft.fft(waveform))
plt.show()

【讨论】:

以上是关于NumPy FFT 元组索引超出范围?的主要内容,如果未能解决你的问题,请参考以下文章

IndexError:元组索引超出范围

Sklearn 线性回归 - “IndexError:元组索引超出范围”

IndexError:元组索引超出范围以拆分特征和标签

如何在python中修复“IndexError:元组索引超出范围”?

IndexError:运行python 3.9.1时元组索引超出范围

k元组排序中的python列表索引超出范围