[英]Incorrect reshaping of 3d array
我正在對形狀為 1536 x 16 x 48 的矩陣進行一些處理。以下是有關此尺寸的一些詳細信息:
因此,從 16 個不同的收集器的角度來看,我有 1536 個值的 48 個樣本(代表 6 秒的數據)。
我的目標是對這個矩陣進行一些處理,但首先需要進行一些轉換。
由於 6 秒是一個大序列,我想將每個樣本分成更小的序列,特別是 3 或 2 秒。 例如,1 個 6 秒樣本 (1536) 可以拆分為 2 個 3 秒樣本 (768) 或 3 個 2 秒樣本 (512)。 這個變換矩陣的形狀是 go 從1536x16x48
到768x16x96
(3 秒)或512x16x144
(2 秒)。
一旦我有了這個新矩陣,我想重塑它,以便每個觀察者得到一個 2d 矩陣,並且所有值都以列而不是行組織(例如 2 秒拆分: 512x16x144
=> 144x512x16
)。
最后,我現在可以遍歷第 3 維( 16
),對每個 2d 矩陣進行一些計算(即快速傅立葉變換)並將它們全部歸約(求和)為一個,以獲得最終的144 x 512
矩陣(在 2 秒內 -分割場景)。
以下代碼是我用numpy
制作的,但是當我使用這種方法生成的 plot 樣本時,這對我來說顯然是錯誤的。
def generate_fft_data(data,labels, n_seconds_split=3):
x = 256 * n_seconds_split
y = 16
z = 48 * int(6/n_seconds_split)
data = data.transpose(2,0,1).reshape(x,y,z).transpose(2,0,1)
fft_data = []
for electrode in range(data.shape[2]):
y_t = fft(data[:,:,electrode])
fft_data.append(np.abs(y_t))
sum_of_ffts = np.add.reduce(fft_data)
return sum_of_ffts
如果需要,我可以提供更多詳細信息。 提前致謝。
你可以試試這個:
def generate_fft_data(data,n_seconds_split=3):
x_split = 6//n_seconds_split
# split along 0 axis, stack pieces along the last axis and transpose
arr = np.dstack(np.split(data, x_split)).transpose(2,0,1)
fft_data = []
for electrode in range(arr.shape[2]):
y_t = fft(arr[:,:,electrode])
fft_data.append(np.abs(y_t))
sum_of_ffts = np.add.reduce(fft_data)
return sum_of_ffts
In [88]: data = np.ones((1536,16,48))
In [89]: x = 256 * 3
...: y = 16
...: z = 48 * int(6/3)
In [90]: x,y,z
Out[90]: (768, 16, 96)
In [91]: data.transpose(2,0,1).shape
Out[91]: (48, 1536, 16)
In [92]: data.transpose(2,0,1).reshape(x,y,z).shape
Out[92]: (768, 16, 96)
將 [91] 重塑為 [92] 沒有意義。 它之所以有效,是因為數字“加起來”,但分布混亂。
我認為您想首先將 1536 維度拆分為 (2,768)(或等效的 3),然后將該 2 維度移動到末尾,並將其與 48 重新組合。
細節可能會有所不同,但這是一個這樣的序列:
data1 = data.reshape(2,768,16,48).transpose(1,2,0,3).reshape(768,16,96)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.