如何重新排序 dstack

How to reorder dstack

我有 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']])

您可以使用 np.moveaxis(X, 0, -2),其中 X 是您的 (1,6042,6) 数组。

这个函数交换轴。 0 为源轴,-2 为目标轴。

错误是因为

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)

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)

所以有很多方法可以得到你想要的东西,无论是在连接之前还是之后调整形状。