为什么irfftn(rfftn(x))不等于x?

时间:2017-03-05 16:25:48

标签: python numpy fft

如果数组x的尾随维度为奇数,则变换y = irfftn(rfftn(x))与输入数组的形状不同。这是设计的吗?如果是这样,动机是什么?示例代码如下。

import numpy as np

shapes = [(10, 10), (11, 11), (10, 11), (11, 10)]

for shape in shapes:
    x = np.random.uniform(0, 1, shape)
    y = np.fft.irfftn(np.fft.rfftn(x))
    if x.shape != y.shape:
        print("expected shape %s but got %s" % (shape, y.shape))

# Output
# expected shape (11, 11) but got (11, 10)
# expected shape (10, 11) but got (10, 10)

1 个答案:

答案 0 :(得分:2)

您需要传递第二个参数x.shape 在您的情况下,代码将如下所示:

import numpy as np

shapes = [(10, 10), (11, 11), (10, 11), (11, 10)]

for shape in shapes:
    x = np.random.uniform(0, 1, shape)
    y = np.fft.irfftn(np.fft.rfftn(x),x.shape)
    if x.shape != y.shape:
        print("expected shape %s but got %s" % (shape, y.shape))

来自文档

  

此函数计算N维离散的倒数   傅立叶变换,用于在任意数量的轴上进行实际输入   通过快速傅立叶变换(FFT)的M维阵列。在   换句话说,irfftn(rfftn(a),a.shape)== a到数字内   准确性。 (a.shape是必要的,像len(a)是用于irfft,而for   同样的原因。)

来自相同文档的x.shape描述:

  

s:整数序列,可选形状(每个变换轴的长度)   输出(s [0]表示轴0,s [1]表示轴1等)。 s也是   沿此轴使用的输入点数,最后一个除外   轴,其中使用s [-1] // 2 + 1个输入点。沿着任何轴,   如果s表示的形状小于输入的形状,则   输入被裁剪。如果它更大,则输入用零填充。如果   s没有给出,输入的形状沿着指定的轴   使用轴。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.irfftn.html