如果数组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)
答案 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