如何在没有for循环的情况下将三维图像矩阵转换为二维矩阵?Python和numpy

如何在没有for循环的情况下将三维图像矩阵转换为二维矩阵?Python和numpy,python,numpy,Python,Numpy,目前正在学校的数据课程中从事实验室工作。我要做的是将具有形状(26,64,64)的矩阵_a转换为新的矩阵_b(641664)。 矩阵_a中的(64,64)是组成一系列图像的位,(641664)矩阵_b应产生一条图像。 我尝试使用np.reforme,它确实正确地重塑了矩阵,但是由于使用的顺序,图像丢失了。我可以使用for循环迭代地将每个64x64图像插入矩阵_b,但他们要求您不要使用for循环。他们提到了一些关于使用拼接的事情? 我正在用python和numpy编写这篇文章。 如果这篇文章毫无意

目前正在学校的数据课程中从事实验室工作。我要做的是将具有形状(26,64,64)的矩阵_a转换为新的矩阵_b(641664)。 矩阵_a中的(64,64)是组成一系列图像的位,(641664)矩阵_b应产生一条图像。 我尝试使用np.reforme,它确实正确地重塑了矩阵,但是由于使用的顺序,图像丢失了。我可以使用for循环迭代地将每个64x64图像插入矩阵_b,但他们要求您不要使用for循环。他们提到了一些关于使用拼接的事情? 我正在用python和numpy编写这篇文章。 如果这篇文章毫无意义,我道歉这是我的第一篇。
感谢使用numpy,您可以尝试以下方法(假设data_3d是您的3d阵列):

transpose()
将轴从
[0,1,2]
重新排序到
[1,0,2]

arr = arr.transpose([1,0,2])   # edit suggested by @wwii 
arr.shape

>>> (64, 64, 26)
连接每个图像

水平条-这是你在问题中要求的

>>> np.concatenate(list(a),-1)
array([[ 0,  1,  4,  5,  8,  9],
       [ 2,  3,  6,  7, 10, 11]])
垂直带

>>> np.concatenate(list(a),0)
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
>>>
np.hstack(tuple(a))
np.vstack(tuple(a))
产生与
串联的相同结果


np.vsplit(a,a.shape[0])
相当于
list(a)
tuple(a)

您能发布您尝试过的代码吗?26,64,64矩阵代表什么?64x64图像在26个不同的时间步长上还是其他什么?您应该提供一些关于矩阵表示法的见解。请阅读。相关:,OP需要一个2d数组,其中26个64x64图像连接在一起。@wwii”和(641664)矩阵_b应产生一条图像“形状的确切单词可能是正确的,但数据出来是否正确?尝试使用(4,3,3)数组-
a=np.arange(3*3*4)。重塑(4,3,3)
arr..transpose([1,0,2])
看起来更好。@wwii是的
transpose()
解决了这个问题。OP并没有具体说明他希望如何按列或按行剥离数据,因此有两个选项用于
transpose()
arr = arr.transpose([1,0,2])   # edit suggested by @wwii 
arr.shape

>>> (64, 64, 26)
arr = arr.reshape([64, -1])
arr.shape

>>> (64, 1664)
>>> a = np.arange(2*2*3).reshape(3,2,2)
>>> a
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])
>>> np.concatenate(list(a),-1)
array([[ 0,  1,  4,  5,  8,  9],
       [ 2,  3,  6,  7, 10, 11]])
>>> np.concatenate(list(a),0)
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
>>>