试图让 Python 连接生成的列向量以形成二维数组。它不工作
Trying to get Python to concatenate generated column vectors to form a two dimensional array. It's not working
我是 Python 的新手。我以前在 MATLAB 中完成过这个特定的任务,我正在尝试掌握 Python 的语法和特定行为,因为我将来会更多地使用这种语言。
任务:我正在获取 43,200 个单个数据点(整数,但写为小数)并一次对 600 的 "window" 执行快速傅里叶变换,将此 window每次增加 60 个数据点。因此,此变换将输出 600 个傅里叶系数,共 720 次——我最终将得到一个 600 x 720 的矩阵(行、列)。
这些数据点最初包含在一个列表中,经过 FFT 后变成列向量。当我尝试从循环构建 maxtrix 时,问题就来了——取前 600 个点,对它们进行 FFT,然后将它们转储到一个空数组中。取下一个 600,做同样的事情,但现在将这两列加在一起形成两行,然后是三行,然后是四行……等等。我现在已经尝试了几个小时,但无论我尝试什么,我都无法得到它工作 - 它始终输出我的 "final" 矩阵(本来是生成的 600 x 720 的矩阵)与每个生成的 "block".
的尺寸完全相同
我的代码(相关部分):
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
returns 它的参数的串联而没有实际修改它们。要累积串联,您应该将结果分配回 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
我是 Python 的新手。我以前在 MATLAB 中完成过这个特定的任务,我正在尝试掌握 Python 的语法和特定行为,因为我将来会更多地使用这种语言。
任务:我正在获取 43,200 个单个数据点(整数,但写为小数)并一次对 600 的 "window" 执行快速傅里叶变换,将此 window每次增加 60 个数据点。因此,此变换将输出 600 个傅里叶系数,共 720 次——我最终将得到一个 600 x 720 的矩阵(行、列)。
这些数据点最初包含在一个列表中,经过 FFT 后变成列向量。当我尝试从循环构建 maxtrix 时,问题就来了——取前 600 个点,对它们进行 FFT,然后将它们转储到一个空数组中。取下一个 600,做同样的事情,但现在将这两列加在一起形成两行,然后是三行,然后是四行……等等。我现在已经尝试了几个小时,但无论我尝试什么,我都无法得到它工作 - 它始终输出我的 "final" 矩阵(本来是生成的 600 x 720 的矩阵)与每个生成的 "block".
的尺寸完全相同我的代码(相关部分):
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
returns 它的参数的串联而没有实际修改它们。要累积串联,您应该将结果分配回 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