我有 6 個檔案,形狀為 (6042,) 或 1 列。我使用 dstack 來堆疊 6 個檔案,希望得到一個形狀 (6042, 1, 6)。但是在我堆疊它之后,我得到了形狀 (1, 6042, 6)。然后我嘗試使用更改順序
new_train = np.reshape(train_x,(train_x[1],1,train_x[2]))
出現錯誤:
IndexError: index 1 is out of bounds for axis 0 with size 1
這是我的 dstack 代碼:
train_x = dstack([train_data['gx'],train_data['gy'], train_data['gz'], train_data['ax'],train_data['ay'], train_data['az']])
uj5u.com熱心網友回復:
錯誤是因為
train_x[1]
嘗試查看 train_x 的第二行,但它只有 1 行,如您所說的形狀 1、6042、6)。所以你需要看形狀并索引它
new_train = np.reshape(train_x, (train_x.shape[1], 1, train_x.shape[2]))
但這也可以通過轉置來實作
new_train = train_x.transpose(1, 0, 2)
所以這會改變軸 0 和 1 的位置。
其他解決方案是修復 dstack 的方式。它給出了“錯誤”的形狀,因為您的資料形狀不是 (6042, 1) 而是 (6042,) 如您所說。因此,如果您在 dstack 之前重塑資料,它也應該可以作業:
datas = [train_data['gx'],train_data['gy'], train_data['gz'],
train_data['ax'],train_data['ay'], train_data['az']]
#this list comprehension makes all shape (6042, 1) now
new_datas = [td[:, np.newaxis] for td in datas]
new_train = dstack(new_datas)
uj5u.com熱心網友回復:
您可以使用np.moveaxis(X, 0, -2),X您的(1,6042,6)陣列在哪里。
此功能交換軸。0為您的源軸,-2是您的目標軸。
uj5u.com熱心網友回復:
np.dstack 用途:
arrs = atleast_3d(*tup)
將陣列串列轉換為 3d 陣列串列。
In [51]: alist = [np.ones(3,int),np.zeros(3,int)]
In [52]: alist
Out[52]: [array([1, 1, 1]), array([0, 0, 0])]
In [53]: np.atleast_3d(*alist)
Out[53]:
[array([[[1],
[1],
[1]]]),
array([[[0],
[0],
[0]]])]
In [54]: _[0].shape
Out[54]: (1, 3, 1)
連接最后一個維度上的那些會產生 (1,n,6) 型別的結果。
隨著expand_dims我們可以調整所有陣列的形狀(N,1,1),然后做串連:
In [62]: np.expand_dims(alist[0],[1,2]).shape
Out[62]: (3, 1, 1)
In [63]: np.concatenate([np.expand_dims(a,[1,2]) for a in alist], axis=2)
Out[63]:
array([[[1, 0]],
[[1, 0]],
[[1, 0]]])
In [64]: _.shape
Out[64]: (3, 1, 2)
直接重塑或newaxis同樣有效:
In [65]: np.concatenate([a[:,None,None] for a in alist], axis=2).shape
Out[65]: (3, 1, 2)
stack 是另一個在連接之前調整形狀的封面:
In [67]: np.stack(alist,1).shape
Out[67]: (3, 2)
In [68]: np.stack(alist,1)[:,None].shape
Out[68]: (3, 1, 2)
所以有很多方法可以得到你想要的東西,無論是在連接之前還是之后調整形狀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376357.html
下一篇:如何將坐標陣列排序為列坐標組?
