如何重新排序 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)
所以有很多方法可以得到你想要的东西,无论是在连接之前还是之后调整形状。
我有 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)
所以有很多方法可以得到你想要的东西,无论是在连接之前还是之后调整形状。