numpy 为什么形状为(200000,1)的FFT与形状为(200000,)的FFT不同?

dgsult0t  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(84)

我正在从商业仪器中获取光学OFDR(123)数据的FFT。
然而,我花了几天时间困惑为什么FFT没有给出预期的结果。原来是因为我导入的数组的形状是(20000,1)而不是(20000,)。前者(20000,1)的FFT返回不变,而形状为(20000,)的对象的FFT产生正确的结果。从概念上讲,这些对我来说似乎是完全相同的数组-但在实践中,它们显然是不同的FFT计算。
谁能解释一下为什么这个看似虚构的维度会破坏我的FFT?

# Produces bad FFT:
>> np.shape(MeasData)
: (433229, 1)

# Produces correct FFT
>> np.shape(MeasData[:,0])
: (433229,)

第二,有一个空的维度意味着什么?也就是说,为什么形状报告为(2000,)而不是(2000)(没有逗号)?
下面是一个图表,显示了这些和相应的傅立叶变换,通过numpy.rfft( MeasData )(对不起,我不知道如何生成有用的MWE数据):

第一个和第二个(MeasData = [433000,1])显示FFT根本没有做任何事情,而第三个和第四个(MeasData = [433000,])显示正确的FFT。
形状[400000,1][400000,]不同,这有什么意义呢?听起来很违反直觉。

bvpmtnay

bvpmtnay1#

默认情况下,numpy.fft.rfft在输入的最后一个维度上计算FFT。当你传递一个形状为(20000, 1)的数组时,它会计算20000个1元素向量的FFT,而不是将输入视为20000个元素向量来计算单个FFT。
NumPy是一个n维数组库,而不是矩阵库。第二个维度长度为1的二维数组被认为与一维数组完全不同。如果你想表示一个向量,你应该总是把它表示为一个一维数组。(20000,)形数组是一维的。

相关问题