numpy.fft.irfft:为什么len(a)是必需的?

时间:2018-10-01 15:31:58

标签: python numpy fft

documentation for numpy.fft.irfft, the inverse discrete Fourier transform for real input,状态

  

此函数计算一维n点的逆   由rfft计算的实数输入的离散傅里叶变换。其他   单词irfft(rfft(a), len(a)) == a到数值精度以内。 (看到   下面的注释说明了为什么在这里需要len(a)。)

但是,“注释”部分似乎并未表明为什么在这种情况下必须指定len(a)。确实,即使省略了长度,一切似乎都可以正常工作。

numpy.random.seed(123456)
a = numpy.random.rand(20)
# array([0.12696983, 0.96671784, 0.26047601, 0.89723652, 0.37674972,
#        0.33622174, 0.45137647, 0.84025508, 0.12310214, 0.5430262 ,
#        0.37301223, 0.44799682, 0.12944068, 0.85987871, 0.82038836,
#        0.35205354, 0.2288873 , 0.77678375, 0.59478359, 0.13755356])
numpy.fft.irfft(numpy.fft.rfft(a))
# array([0.12696983, 0.96671784, 0.26047601, 0.89723652, 0.37674972,
#        0.33622174, 0.45137647, 0.84025508, 0.12310214, 0.5430262 ,
#        0.37301223, 0.44799682, 0.12944068, 0.85987871, 0.82038836,
#        0.35205354, 0.2288873 , 0.77678375, 0.59478359, 0.13755356])

我打给len(a)的电话时可以省略numpy.fft.rfft吗?

1 个答案:

答案 0 :(得分:1)

如注释中所示,如果长度为偶数,则省略长度是可行的,但如果它是奇数,则不可行:

numpy.random.seed(123456)
a = numpy.random.rand(21)
# array([0.12696983, 0.96671784, 0.26047601, 0.89723652, 0.37674972,
#        0.33622174, 0.45137647, 0.84025508, 0.12310214, 0.5430262 ,
#        0.37301223, 0.44799682, 0.12944068, 0.85987871, 0.82038836,
#        0.35205354, 0.2288873 , 0.77678375, 0.59478359, 0.13755356,
#        0.85289978])
numpy.fft.irfft(numpy.fft.rfft(a))
# array([0.24111601, 0.90078174, 0.37803686, 0.86982605, 0.38581891,
#        0.29202917, 0.72002065, 0.59446031, 0.23485829, 0.55698438,
#        0.42253411, 0.26457788, 0.49961714, 1.06138356, 0.45849842,
#        0.22863701, 0.68431715, 0.73579194, 0.14511054, 0.82140976])

关于numpy.fft.rfft numpy.fft.irfft返回值的文档解释了为什么会发生这种情况,尽管对numpy.fft.irfft的“注释”部分的引用仍然具有误导性:

  

numpy.fft.rfft (a,n =无,轴= -1,范数=无)

     

返回:

     

输出:复杂的ndarray
  截断或零填充的输入,沿轴转换   用 axis 表示;如果未指定 axis ,则最后一个。如果    n 是偶数,转换后的轴的长度为(n/2)+1。如果 n 为奇数,则长度为(n+1)/2


  

numpy.fft.irfft (a,n =无,轴= -1,范数=无)

     

返回:

     

输出:ndarray
  截断或补零的输入,沿 axis 指示的轴转换,如果未指定 axis ,则最后一个输入。转换后的轴的长度为 n ,或者,如果未给出 n ,则为2*(m-1),其中m是输入。要获得奇数个输出点,必须指定 n