我是Python新手。我以前在MATLAB中做过这个特殊的任务,我试图掌握Python的语法和特定行为,因为我将来会更多地使用这种语言。
任务:我正在取43,200个单数据点(整数,但写成小数),并在一次600的"窗口"上执行快速傅里叶变换,每次将该窗口移动60个数据点。因此,这个变换将输出600个傅立叶系数,720乘以-我将得到一个600 × 720的矩阵(行,列)
这些数据点最初包含在一个列表中,并在FFT后转换为列向量。当我尝试从循环中构建矩阵时,问题就出现了——取前600个点,FFT它们,并将它们转储到一个空数组中。取下一个600,做同样的事情,但现在把这两列加在一起成为两行,然后是三行,然后是四行……等。我已经尝试了几个小时了,但无论我尝试什么,我都不能让它工作-它始终输出我的"最终"矩阵(即生成的600 x 720)作为与每个生成的"块"完全相同的维度。
我的代码(相关部分):
for i in range(npoints):
newdata.append(float(newy.readline())) #Read data from file
FFT_out = [] #Initialize empty FFT output array
window_size = 600 #Number of points in data "window"
window_skip = 60 #Number of points window moves across
j = 0 #FFT count variable
for i in range(0, npoints, window_skip):
block = np.fft.fft(newdata[i:i+window_size]) #FFT Computation of "window"
block = block[:, np.newaxis] #turn into column vector (n, 1)
if j == 0:
FFT_out = block
j = 1
else:
np.hstack((FFT_out, block))
j = j + 1
print("Shape of FFT matrix:")
print(np.shape(FFT_out))
print("Number of times FFT completed:")
print(j)
在这一点上,我愿意相信这是我对Python如何处理矩阵或处理数组的理解中的一个根本性缺陷。我试着读了一下,但我仍然看不出我错在哪里。任何帮助将非常感激! 首先要注意的是,Python使用缩进来形成块,所以正如发布的那样,你只会给FFT_out
赋值一次,而不会实际调用np.hstack
。
然后假设这实际上只是发布问题时的剪切和粘贴问题,您应该注意到hstack
返回其参数的串联而无需实际修改它们。要累积连接,您应该将结果赋值回FFT_out
:
FFT_out = np.hstack((FFT_out, block))
你应该能够得到一个600 x 720矩阵:
for i in range(0, npoints, window_skip):
block = np.fft.fft(newdata[i:i+window_size])
block = block[:, np.newaxis] #turn into column vector (n, 1)
if j == 0:
FFT_out = block
j = 1
else:
FFT_out = np.hstack((FFT_out, block))
j = j + 1