改变nparray的形状

时间:2016-12-07 16:11:27

标签: python numpy

import numpy as np
​
image1 = np.zeros((120, 120))
image2 = np.zeros((120, 120))
image3 = np.zeros((120, 120))
​
pack1 = np.array([image1,image2,image3])
pack2 = np.array([image1,image2,image3])
​
result = np.array([pack1,pack2])

print result.shape

结果是: (2,3,120,120)

问题:如何在不混合的情况下使用相同的数据制作具有形状(2,120,120,3)的数组?

3 个答案:

答案 0 :(得分:4)

使用np.rollaxis将单个轴移动(确定,滚动)到指定位置:

>>> a.shape
(2, 3, 11, 11)
>>> np.rollaxis(a, 0, 4).shape
(3, 11, 11, 2)

这里的语法是"滚动第0个轴,使它成为新数组中的第4个"。

请注意rollaxis创建了一个视图,但没有复制:

>>> np.rollaxis(a, 0, 4).base is a
True

另一种(通常更具可读性)方式是使用np.transpose接受放置轴的位置元组的事实。观察:

>>> np.transpose(a, (1, 2, 3, 0)).shape
(3, 11, 11, 2)
>>> np.transpose(a, (1, 2, 3, 0)).base is a
True

这里的语法是"置换轴,使原始数组中的第0轴成为新数组中的第4轴"

答案 1 :(得分:1)

您可以转置packs

pack1 = np.array([image1,image2,image3]).T
pack2 = np.array([image1,image2,image3]).T

并且结果具有您想要的形状。

答案 2 :(得分:1)

(相对)新的stack函数可以更好地控制np.array如何连接数组。

使用stack将它们连接到新的最后一个轴上:

In [24]: pack1=np.stack((image1,image2,image3),axis=2)
In [25]: pack1.shape
Out[25]: (120, 120, 3)
In [26]: pack2=np.stack((image1,image2,image3),axis=2)

然后加入新的第一个轴(与np.array()相同):

In [27]: result=np.stack((pack1,pack2),axis=0)
In [28]: result.shape
Out[28]: (2, 120, 120, 3)