如何将Numpy数组从(x,y,z)重塑为(y,z,x)

时间:2018-10-05 17:00:40

标签: python arrays numpy

我有一个尺寸为(3,120,100)的数组,我想将其转换为尺寸为(120,100,3)的数组。我拥有的数组是

arr1 = np.ones((120,100), dtype = int)
arr2 = arr1*2
arr3 = arr1*3
arr = np.stack((arr1,arr2,arr3))
arr

它包含三个120x100的1、2和3数组。当我在其上使用reshape时,会得到120x100的1、2或3数组。

我想获得一个120x100的数组,其中每个元素为[1,2,3]

3 个答案:

答案 0 :(得分:2)

如果您想要一个包含如您所描述的123的大型数组,则推荐使用user3483203's answer。通常,如果您有一个形状为(X, Y, Z)的数组,并且希望将其设置为(Y, Z, X),通常可以使用np.transpose

import numpy as np

arr = ... # Array with shape (3, 120, 100)
arr_reshaped = np.transpose(arr, (1, 2, 0))
print(arr_reshaped.shape)
# (120, 100, 3)

编辑:问题标题表明您希望将数组从(X, Y, Z)重塑为(Z, Y, X),但是文本似乎暗示您希望将数组从(X, Y, Z)重塑为(Y, Z, X) 。我紧跟着文字,但标题中的文字只是np.transpose(arr, (2, 1, 0))

答案 1 :(得分:1)

您不需要创建非常大的数组并进行整形。由于您知道每个元素的形状和最终形状,因此可以使用numpy.broadcast_to。这要求仅创建形状data=pd.DataFrame({'A':['X','X','Y','Y','X','X','Y','Y'], 'B':[0,1,2,3,4,5,6,7], 'C':[1,1,1,1,2,2,2,2], 'type':['ctrl','cond1','ctrl','cond1','ctrl','cond1','ctrl','cond1']} ) 数组的设置。

设置

(3,)

arr = np.array([1,2,3])

np.broadcast_to(arr, (120, 100, 3))

要获取此输出的非只读版本,可以调用array([[[1, 2, 3], [1, 2, 3], [1, 2, 3], ..., [1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3], ..., [1, 2, 3], [1, 2, 3], [1, 2, 3]]])

copy()

答案 2 :(得分:1)

我将回答这个问题,假设它是一个较大问题的一部分,而这只是示例数据,用以演示您想要做的事情。否则,广播解决​​方案就可以正常工作。

使用reshape时,它不会改变numpy解释单个元素顺序的方式。它只是影响numpy如何查看numpy形状。因此,如果磁盘上的数组中有元素a, b, c, d,则可以解释为形状(4,)或形状(2,2)或形状(1,4)等的数组。

您正在寻找的似乎是transpose。这会影响交换numpy解释轴的方式。就您而言

>>>arr.transpose(2,1,0)
array([[[1, 2, 3],
    [1, 2, 3],
    [1, 2, 3],
    ..., 
    [1, 2, 3],
    [1, 2, 3],
    [1, 2, 3]]])