在下面的4D
数组中,每列表示一个用于机器学习模型开发的属性。
import numpy as np
from scipy.fft import fft, fftfreq, fftshift
A = np.array([
[[[0, 1, 2, 3],
[3, 0, 1, 2],
[2, 3, 0, 1],
[1, 3, 2, 1],
[1, 2, 3, 0]]],
[[[9, 8, 7, 6],
[5, 4, 3, 2],
[0, 9, 8, 3],
[1, 9, 2, 3],
[1, 0, -1, 2]]],
[[[0, 7, 1, 2],
[1, 2, 1, 0],
[0, 2, 0, 7],
[-1, 3, 0, 1],
[1, 0, 1, 0]]]
])
A.shape
(3, 1, 5, 4)
在本例中,A
有3个示例,每个示例由4个特征表示(内部数组((1,5,4)
形状)的每列1个特征)。
我需要一种简便的方法来计算每个示例的每个特性的frequency-domain
(傅立叶变换)。
- 详细信息**
考虑到给出的例子,我用下面的方法来做。
1.获取所有功能的数组(每个功能1个,如下所示:
feat1 = A[..., [0]] # the first feature
feat2 = A[..., [1]] # the second feature
feat3 = A[..., [2]] # 3rd feature etc...
feat4 = A[..., [3]] # 4th feature etc...
因此,示例数据中的第一个特征为:
feat1
array([[[[ 0],
[ 3],
[ 2],
[ 1],
[ 1]]],
[[[ 9],
[ 5],
[ 0],
[ 1],
[ 1]]],
[[[ 0],
[ 1],
[ 0],
[-1],
[ 1]]]])
1.检索每个示例的特征集,如下所示:
# 1st instance
inst1_1 = feat1[0].ravel() # instance1 1st feature
inst1_2 = feat2[0].ravel() # instance1 2nd feature
inst1_3 = feat3[0].ravel() # instance1 3rd feature
inst1_4 = feat4[0].ravel() # instance1 4th feature
# 2nd instance
inst2_1 = feat1[1].ravel() # instance2 1st feature
inst2_2 = feat2[1].ravel() # instance2 2nd feature
inst2_3 = feat3[1].ravel() # instance2 3rd feature
inst2_4 = feat4[1].ravel() # instance2 4th feature
# 3rd instance
inst3_1 = feat1[2].ravel() # instance3 1st feature
inst3_2 = feat2[2].ravel() # instance3 2nd feature
inst3_3 = feat3[2].ravel() # instance3 3rd feature
inst3_4 = feat4[2].ravel() # instance3 4th feature
1.然后计算傅立叶变换(针对每个示例的每个特征)。
inst1_1_fft = fft(inst1_1)
inst1_2_fft = fft(inst1_2)
inst1_3_fft = fft(inst1_3)
inst1_4_fft = fft(inst1_4)
inst2_1_fft = fft(inst2_1)
inst2_2_fft = fft(inst2_2)
inst2_3_fft = fft(inst2_3)
inst2_4_fft = fft(inst2_4)
inst3_1_fft = fft(inst3_1)
inst3_2_fft = fft(inst3_2)
inst3_3_fft = fft(inst3_3)
inst3_4_fft = fft(inst3_4)
这绝对是dummies approach
。此外,我不能在我的真实数据集上这样做,那里我有超过60K的示例。
- 问题:**
1.如何对整个阵列A
同时执行此操作?
1.频率似乎是相同的,对于每个示例的特征。我这样做是正确的吗?他是我怎么做的:
sampling_rate = A.shape[2] # each instance is fixed-sized A.shape[2] (5 in this e.g)
N = inst1_1_fft.size
inst1_1_fft_freq = fftfreq(N, d = 1 / sampling_rate)
inst1_1_fft_freq
array([ 0., 1., 2., -2., -1.])
1条答案
按热度按时间qij5mzcb1#
为了一次沿着所有示例的特征执行快速傅立叶变换,您可以沿
axis=2
执行。作为一种替代方法,您可以在计算fft
之前,使用np.reshape
和np.swapaxes
首先对A
进行整形,一种可能的解决方案是:它遵循与您问题中相同的示例/特性顺序。您还可以通过比较生成的
inst_reshape
数组与其手动组装的对应数组来检查这一点:完成这些操作后,现在可以沿着新整形数组的列轴
axis=1
调用np.fft.fft
一次:我肯定会鼓励您看一下下面的question,其中很好地解释了这种数组转换背后的一般思想。