3 回答

TA贡献1795条经验 获得超7个赞
整形时要小心。即使它有效,元素的排列也可能不是你想要的。
从一个我们可以形象化的简单数组开始:
In [805]: x = np.arange(24).reshape(3,2,4)
In [806]: x
Out[806]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
重塑为 (-1,2,1) - 但让我们删除最后 1 以获得更紧凑的显示:
In [807]: x.reshape(-1,2)
Out[807]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11],
[12, 13],
[14, 15],
[16, 17],
[18, 19],
[20, 21],
[22, 23]])
注意原始 [0,1,2,3] 行是如何分成 2 行的。
另一种重新分配大小为 4 的最后一个维度的方法是:
In [808]: np.vstack([x[...,i] for i in range(4)])
Out[808]:
array([[ 0, 4],
[ 8, 12],
[16, 20],
[ 1, 5],
[ 9, 13],
[17, 21],
[ 2, 6],
[10, 14],
[18, 22],
[ 3, 7],
[11, 15],
[19, 23]])
如果我们使用np.stack并得到 (4,3,2) 形状,那可能会更清楚
array([[[ 0, 4],
[ 8, 12],
[16, 20]],
....
x.transpose(2,0,1) 产生同样的东西。
reshape保留元素的散乱/扁平顺序。转置改变它。
In [812]: x.transpose(2,0,1).ravel()
Out[812]:
array([ 0, 4, 8, 12, 16, 20, 1, 5, 9, 13, 17, 21, 2, 6, 10, 14,...])
In [813]: x.reshape(-2,2).ravel()
Out[813]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ...])

TA贡献1770条经验 获得超3个赞
您拥有的代码没有做您认为的那样。i[0]
获取第一个轴上的第 0 个元素,即您的80
,这不是您想要的。
无论如何,您真正想要的是选择最快方向的第一个切片,所以只需执行以下操作:
X = train[:,:,:,0:1]
如果您的数据实际上不是您所说的大小,请尝试:
X = np.array([i.reshape(80, 60, 4)[:,:,0:1] for i in train])
添加回答
举报