Python 将 3d 数组重塑为 2d
Python Reshape 3d array into 2d
我想按照描绘的那样重塑 numpy 数组,从 3D 到 2D。很遗憾,顺序不正确。
假设有一个 numpy 数组 (1024, 64, 100) 并想将其转换为 (1024*100, 64)。
有人知道如何维持秩序吗?
我有一个示例数据
data[0,0,0]=1
data[0,1,0]=2
data[0,2,0]=3
data[0,3,0]=4
data[1,0,0]=5
data[1,1,0]=6
data[1,2,0]=7
data[1,3,0]=8
data[2,0,0]=9
data[2,1,0]=10
data[2,2,0]=11
data[2,3,0]=12
data[0,0,1]=20
data[0,1,1]=21
data[0,2,1]=22
data[0,3,1]=23
data[1,0,1]=24
data[1,1,1]=25
data[1,2,1]=26
data[1,3,1]=27
data[2,0,1]=28
data[2,1,1]=29
data[2,2,1]=30
data[2,3,1]=31
我希望得到这样的结果:
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[ 20., 21., 22., 23.],
[ 24., 25., 26., 27.],
[ 28., 29., 30., 31.]])
此外,我还想用另一种方式进行整形,即来自:
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[ 20., 21., 22., 23.],
[ 24., 25., 26., 27.],
[ 28., 29., 30., 31.]])
到所需的输出:
[[[ 1. 20.]
[ 2. 21.]
[ 3. 22.]
[ 4. 23.]]
[[ 5. 24.]
[ 6. 25.]
[ 7. 26.]
[ 8. 27.]]
[[ 9. 28.]
[ 10. 29.]
[ 11. 30.]
[ 12. 31.]]]
看起来你可以使用 numpy.transpose
然后重塑,像这样 -
data.transpose(2,0,1).reshape(-1,data.shape[1])
样本运行-
In [63]: data
Out[63]:
array([[[ 1., 20.],
[ 2., 21.],
[ 3., 22.],
[ 4., 23.]],
[[ 5., 24.],
[ 6., 25.],
[ 7., 26.],
[ 8., 27.]],
[[ 9., 28.],
[ 10., 29.],
[ 11., 30.],
[ 12., 31.]]])
In [64]: data.shape
Out[64]: (3, 4, 2)
In [65]: data.transpose(2,0,1).reshape(-1,data.shape[1])
Out[65]:
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[ 20., 21., 22., 23.],
[ 24., 25., 26., 27.],
[ 28., 29., 30., 31.]])
In [66]: data.transpose(2,0,1).reshape(-1,data.shape[1]).shape
Out[66]: (6, 4)
要取回原始 3D 数组,请使用 reshape
,然后使用 numpy.transpose
,就像这样 -
In [70]: data2D.reshape(np.roll(data.shape,1)).transpose(1,2,0)
Out[70]:
array([[[ 1., 20.],
[ 2., 21.],
[ 3., 22.],
[ 4., 23.]],
[[ 5., 24.],
[ 6., 25.],
[ 7., 26.],
[ 8., 27.]],
[[ 9., 28.],
[ 10., 29.],
[ 11., 30.],
[ 12., 31.]]])
使用 einops:
# start with (1024, 64, 100) to (1024*100, 64):
einops.rearrange('h w i -> (i h) w')
# or we could concatenate along horizontal axis to get (1024, 64 * 100):
einops.rearrange('h w i -> h (i w)')
有关更多示例,请参阅 docs
我想按照描绘的那样重塑 numpy 数组,从 3D 到 2D。很遗憾,顺序不正确。
假设有一个 numpy 数组 (1024, 64, 100) 并想将其转换为 (1024*100, 64)。
有人知道如何维持秩序吗?
我有一个示例数据
data[0,0,0]=1
data[0,1,0]=2
data[0,2,0]=3
data[0,3,0]=4
data[1,0,0]=5
data[1,1,0]=6
data[1,2,0]=7
data[1,3,0]=8
data[2,0,0]=9
data[2,1,0]=10
data[2,2,0]=11
data[2,3,0]=12
data[0,0,1]=20
data[0,1,1]=21
data[0,2,1]=22
data[0,3,1]=23
data[1,0,1]=24
data[1,1,1]=25
data[1,2,1]=26
data[1,3,1]=27
data[2,0,1]=28
data[2,1,1]=29
data[2,2,1]=30
data[2,3,1]=31
我希望得到这样的结果:
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[ 20., 21., 22., 23.],
[ 24., 25., 26., 27.],
[ 28., 29., 30., 31.]])
此外,我还想用另一种方式进行整形,即来自:
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[ 20., 21., 22., 23.],
[ 24., 25., 26., 27.],
[ 28., 29., 30., 31.]])
到所需的输出:
[[[ 1. 20.]
[ 2. 21.]
[ 3. 22.]
[ 4. 23.]]
[[ 5. 24.]
[ 6. 25.]
[ 7. 26.]
[ 8. 27.]]
[[ 9. 28.]
[ 10. 29.]
[ 11. 30.]
[ 12. 31.]]]
看起来你可以使用 numpy.transpose
然后重塑,像这样 -
data.transpose(2,0,1).reshape(-1,data.shape[1])
样本运行-
In [63]: data
Out[63]:
array([[[ 1., 20.],
[ 2., 21.],
[ 3., 22.],
[ 4., 23.]],
[[ 5., 24.],
[ 6., 25.],
[ 7., 26.],
[ 8., 27.]],
[[ 9., 28.],
[ 10., 29.],
[ 11., 30.],
[ 12., 31.]]])
In [64]: data.shape
Out[64]: (3, 4, 2)
In [65]: data.transpose(2,0,1).reshape(-1,data.shape[1])
Out[65]:
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[ 20., 21., 22., 23.],
[ 24., 25., 26., 27.],
[ 28., 29., 30., 31.]])
In [66]: data.transpose(2,0,1).reshape(-1,data.shape[1]).shape
Out[66]: (6, 4)
要取回原始 3D 数组,请使用 reshape
,然后使用 numpy.transpose
,就像这样 -
In [70]: data2D.reshape(np.roll(data.shape,1)).transpose(1,2,0)
Out[70]:
array([[[ 1., 20.],
[ 2., 21.],
[ 3., 22.],
[ 4., 23.]],
[[ 5., 24.],
[ 6., 25.],
[ 7., 26.],
[ 8., 27.]],
[[ 9., 28.],
[ 10., 29.],
[ 11., 30.],
[ 12., 31.]]])
使用 einops:
# start with (1024, 64, 100) to (1024*100, 64):
einops.rearrange('h w i -> (i h) w')
# or we could concatenate along horizontal axis to get (1024, 64 * 100):
einops.rearrange('h w i -> h (i w)')
有关更多示例,请参阅 docs