将 3D Numpy 数组重塑为 2D 数组
Reshaping 3D Numpy Array to a 2D array
我在 Numpy 中有以下 3D 数组:
a = np.array([[[1,2],[3,4]], [[5,6],[7,8]], [[9,10],[11,12]],[[13,14],[15,16]]])
当我写
b = np.reshape(a, [4,4])
二维结果数组看起来像
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
但是,我希望它是这个形状:
[[ 1 2 5 6]
[ 3 4 7 8]
[ 9 10 13 14]
[11 12 15 16]]
如何在 Python/Numpy 中高效地执行此操作?
Reshape 将第一个轴分成两个,置换轴和另一个 reshape -
a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
a.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4)
将其设为通用,将变为 -
m,n,r = a.shape
out = a.reshape(m//2,2,n,r).swapaxes(1,2).reshape(-1,2*r)
样本运行-
In [20]: a
Out[20]:
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]],
[[13, 14],
[15, 16]]])
In [21]: a.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4)
Out[21]:
array([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])
仅使用 np.hstack
和 np.vstack
的另一种方法:
In [98]: a
Out[98]:
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]],
[[13, 14],
[15, 16]]])
In [99]: s0, s1, s2, s3 = range(a.shape[0])
In [100]: np.vstack((np.hstack((a[s0], a[s1])), np.hstack((a[s2], a[s3]))))
Out[100]:
array([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])
意识到您的目标是将原始数组的前两个切片压缩为一个切片,然后将接下来的两个切片压缩为另一个切片,依此类推。
如果您担心性能,您也可以将 np.vstack
和 np.hstack
替换为它们最快的同类 np.concatenate
。
P.S.: 这种方法创建了一个新的数组,保持原来的不变。
我在 Numpy 中有以下 3D 数组:
a = np.array([[[1,2],[3,4]], [[5,6],[7,8]], [[9,10],[11,12]],[[13,14],[15,16]]])
当我写
b = np.reshape(a, [4,4])
二维结果数组看起来像
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
但是,我希望它是这个形状:
[[ 1 2 5 6]
[ 3 4 7 8]
[ 9 10 13 14]
[11 12 15 16]]
如何在 Python/Numpy 中高效地执行此操作?
Reshape 将第一个轴分成两个,置换轴和另一个 reshape -
a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
a.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4)
将其设为通用,将变为 -
m,n,r = a.shape
out = a.reshape(m//2,2,n,r).swapaxes(1,2).reshape(-1,2*r)
样本运行-
In [20]: a
Out[20]:
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]],
[[13, 14],
[15, 16]]])
In [21]: a.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4)
Out[21]:
array([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])
仅使用 np.hstack
和 np.vstack
的另一种方法:
In [98]: a
Out[98]:
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]],
[[13, 14],
[15, 16]]])
In [99]: s0, s1, s2, s3 = range(a.shape[0])
In [100]: np.vstack((np.hstack((a[s0], a[s1])), np.hstack((a[s2], a[s3]))))
Out[100]:
array([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])
意识到您的目标是将原始数组的前两个切片压缩为一个切片,然后将接下来的两个切片压缩为另一个切片,依此类推。
如果您担心性能,您也可以将 np.vstack
和 np.hstack
替换为它们最快的同类 np.concatenate
。
P.S.: 这种方法创建了一个新的数组,保持原来的不变。