将一维numpy数组克隆为3维时出现维数顺序问题

时间:2018-12-04 07:39:30

标签: python arrays numpy

我在寻找一种方法来克隆1-D numpy数组以创建3-D数组时遇到了麻烦。举例来说,我有

z = np.array([0, 2, 3, 5, 7, 9, 10])

这表示3-D空间中的垂直列(例如,以米为单位)。我想创建一个水平尺寸(x,y),以便最终数组具有尺寸(len(z), len(x), len(y)),其中每个x,y点的每一列都相同。我这样做是为了使空间尺寸与我拥有的其他3-D数据匹配。

因此,以数组z作为输入,并假设水平尺寸为ndimx = 3,ndimy = 2,我想找到一个输出数组的函数

np.array([ [[0, 0], [0, 0], [0, 0]],  
           [[2, 2], [2, 2], [2, 2]],       
           [[3, 3], [3, 3], [3, 3]],       
           [[5, 5], [5, 5], [5, 5]],       
           [[7, 7], [7, 7], [7, 7]],       
           [[9, 9], [9, 9], [9, 9]],       
           [[10, 10], [10, 10], [10, 10]] ])

,其形状为(7,3,2)。起初,这对我而言似乎微不足道,但是经过多年尝试np.dstack(),np.astype(),np.repeat()以及与().T进行转置,我无法正确获得尺寸顺序。

这很关键,垂直列是第一维。我愿意打赌答案的确是微不足道的,我只是找不到能够实现此目的的神奇的numpy函数。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我们可以简单地使用np.broadcast_to来查看输入z,而没有额外的内存开销,因此实际上几乎没有性能-

np.broadcast_to(z[:,None,None],(len(z),ndimx,ndimy))

样品运行-

In [23]: z
Out[23]: array([ 0,  2,  3,  5,  7,  9, 10])

In [24]: ndimx=3; ndimy=2

In [25]: np.broadcast_to(z[:,None,None],(len(z),ndimx,ndimy))
Out[25]: 
array([[[ 0,  0],
        [ 0,  0],
        [ 0,  0]],

       [[ 2,  2],
        [ 2,  2],
        [ 2,  2]],

       [[ 3,  3],
        [ 3,  3],
        [ 3,  3]],

       [[ 5,  5],
        [ 5,  5],
        [ 5,  5]],

       [[ 7,  7],
        [ 7,  7],
        [ 7,  7]],

       [[ 9,  9],
        [ 9,  9],
        [ 9,  9]],

       [[10, 10],
        [10, 10],
        [10, 10]]])

答案 1 :(得分:0)

In [360]: z = np.array([0, 2, 3, 5, 7, 9, 10])
In [361]: z1 = np.stack([z,z], axis=1)
In [362]: z2 = np.stack([z1,z1,z1],axis=1)
In [363]: z2
Out[363]: 
array([[[ 0,  0],
        [ 0,  0],
        [ 0,  0]],

       [[ 2,  2],
        [ 2,  2],
        [ 2,  2]],

       [[ 3,  3],
        [ 3,  3],
        [ 3,  3]],

      ... 
       [[10, 10],
        [10, 10],
        [10, 10]]])