如何将3D numpy数组转换为2D?

32

我有一个像这样的三维矩阵

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(和/或vstack)或添加额外的维度和重塑的情况下完成?

2个回答

44
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]])

我在这里发布了更通用的函数,可用于将数组转换为块,或将块转换回数组 (点击此处)


3
好的,假设我有N个块矩阵,每个矩阵的维度为bm x bn,我想将它们堆叠成一个m x n的矩阵,条件是N = m x n,那么我可以使用下面的代码实现: x.reshape(m,n,bm,bn).swapaxes(1,2).reshape(bm*m,-1)我只想知道是否有任何NumPy函数可实现此目的。再次感谢@unutbu。 - poeticcapybara
@unutbu:嗯,我同意EOL的观点,这是一个非常优雅的技巧,在4D中交换轴是完成任务的一种很酷的方式! - Jaime
@unutbu:知道这样的解决方案需要一些思考是很好的。 :) 我注意到你的解决方案是你的第27个shell输入,所以我猜想它并不容易得到。 :) 得到确认是好的。 - Eric O. Lebigot
@unutbu:我在这里有一个类似的问题,https://dev59.com/w5Pfa4cB1Zd3GeqPJenv - ajfbiw.s
你能看一下吗?谢谢。 - ajfbiw.s
如果我们在numpy的官方文档中对reshape进行扩展(只是几个词),按照以下方式阅读也是有意义的:ndarray.reshape(第四维, 第三维, 第二维, 第一维),最高的维度总是排在最前面。 - undefined

0
将一个三维数组转换成二维数组时,transpose()是非常有用的函数。例如,为了得到原帖中期望的结果,在通过添加一个额外的维度进行重新整形后,可以使用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)

result1


表面上看起来,它与swapaxes()执行相同的工作,但由于transpose()允许任意轴的置换,因此更加灵活。例如,要进行以下转换,必须交换两个轴,因此需要调用两次swapaxes(),但可以通过单个transpose()调用来处理。

result2

reshaped_arr = arr.reshape(2,2,2,2).transpose(1,2,0,3).reshape(4,-1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接