我有一个尺寸为(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]
答案 0 :(得分:2)
如果您想要一个包含如您所描述的1
,2
和3
的大型数组,则推荐使用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]]])