我有一个像这样的 3d 矩阵
np.arange(16).reshape((4,2,2))
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]])
并想以网格格式堆叠它们,最终得到
array([[ 0, 1, 4, 5],
[ 2, 3, 6, 7],
[ 8, 9, 12, 13],
[10, 11, 14, 15]])
有没有一种方法可以在不明确地
hstack
ing(和/或vstack
ing)它们或添加额外的维度和重塑的情况下进行?
In [27]: x = np.arange(16).reshape((4,2,2))
In [28]: x.reshape(2,2,2,2).swapaxes(1,2).reshape(4,-1)
Out[28]:
array([[ 0, 1, 4, 5],
[ 2, 3, 6, 7],
[ 8, 9, 12, 13],
[10, 11, 14, 15]])
我在这里发布了更通用的函数,用于将数组重新整形/取消整形为块,。
transpose()
是一个非常有用的函数。例如,为了在 OP 中得出预期结果,在通过添加额外维度进行重塑后,可以使用
transpose()
交换第二个和第三个轴。
arr = np.arange(16).reshape(4,2,2)
reshaped_arr = arr.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,-1)
swapaxes()
执行相同的工作,但由于
transpose()
允许轴的任何排列,因此它更加灵活。例如,要进行以下转换,必须交换两个轴,因此
swapaxes()
必须调用两次,但可以通过单个
transpose()
调用来处理。
reshaped_arr = arr.reshape(2,2,2,2).transpose(1,2,0,3).reshape(4,-1)
import numpy as np
# Original 3D array
a = np.arange(16).reshape((4, 2, 2))
print(a)
'''
[[[ 0 1]
[ 2 3]]
[[ 4 5]
[ 6 7]]
[[ 8 9]
[10 11]]
[[12 13]
[14 15]]]
'''
using_einsum = np.einsum('abcd -> acbd',a.reshape(2,2,2,2)).reshape(4,4)
print(using_einsum)
'''
[[ 0 1 4 5]
[ 2 3 6 7]
[ 8 9 12 13]
[10 11 14 15]]
'''