【问题标题】:How to reorder dstack如何重新排序 dstack
【发布时间】:2022-01-12 07:32:37
【问题描述】:

我有 6 个形状为 (6042,) 或 1 列的文件。我使用 dstack 堆叠 6 个文件,希望得到一个形状(6042、1、6)。但是在我堆叠它之后,我得到了形状 (1, 6042, 6)。然后我尝试使用

更改顺序
new_train = np.reshape(train_x,(train_x[1],1,train_x[2]))

出现错误:

IndexError: index 1 is out of bounds for axis 0 with size 1

这是我的 dstack 代码:

train_x = dstack([train_data['gx'],train_data['gy'], train_data['gz'], train_data['ax'],train_data['ay'], train_data['az']])

【问题讨论】:

  • np.stack(x_train, axis=1)[:,None]

标签: python arrays numpy reshape


【解决方案1】:

错误是因为

train_x[1]

尝试查看 train_x 的第二行,但它只有 1 行,如您所说的形状 1、6042、6)。所以你需要看形状并索引它

new_train = np.reshape(train_x, (train_x.shape[1], 1, train_x.shape[2]))

但这也可以通过转置实现

new_train = train_x.transpose(1, 0, 2)

所以这会改变轴 0 和轴 1 的位置。

其他解决方案是修复 dstack 的方式。它给出了“错误”的形状,因为您的数据形状不是 (6042, 1) 而是 (6042,) 如您所说。因此,如果您在 dstack 之前重塑数据,它也应该可以工作:

datas = [train_data['gx'],train_data['gy'], train_data['gz'],
         train_data['ax'],train_data['ay'], train_data['az']]

#this list comprehension makes all shape (6042, 1) now
new_datas = [td[:, np.newaxis] for td in datas]

new_train = dstack(new_datas)

【讨论】:

    【解决方案2】:

    您可以使用np.moveaxis(X, 0, -2),其中X 是您的(1,6042,6) 数组。

    此函数交换轴。 0 是您的源轴,-2 是您的目标轴。

    【讨论】:

      【解决方案3】:

      np.dstack 使用:

      arrs = atleast_3d(*tup)
      

      将数组列表转换为 3d 数组列表。

      In [51]: alist = [np.ones(3,int),np.zeros(3,int)]
      In [52]: alist
      Out[52]: [array([1, 1, 1]), array([0, 0, 0])]
      In [53]: np.atleast_3d(*alist)
      Out[53]: 
      [array([[[1],
               [1],
               [1]]]),
       array([[[0],
               [0],
               [0]]])]
      In [54]: _[0].shape
      Out[54]: (1, 3, 1)
      

      连接最后一个维度上的结果会产生 (1,n,6) 类型的结果。

      使用expand_dims,我们可以将所有数组的形状调整为(n,1,1),然后进行连接:

      In [62]: np.expand_dims(alist[0],[1,2]).shape
      Out[62]: (3, 1, 1)
      In [63]: np.concatenate([np.expand_dims(a,[1,2]) for a in alist], axis=2)
      Out[63]: 
      array([[[1, 0]],
      
             [[1, 0]],
      
             [[1, 0]]])
      In [64]: _.shape
      Out[64]: (3, 1, 2)
      

      直接重塑或newaxis 也可以:

      In [65]: np.concatenate([a[:,None,None] for a in alist], axis=2).shape
      Out[65]: (3, 1, 2)
      

      stack 是另一个在连接之前调整形状的封面:

      In [67]: np.stack(alist,1).shape
      Out[67]: (3, 2)
      In [68]: np.stack(alist,1)[:,None].shape
      Out[68]: (3, 1, 2)
      

      所以有很多方法可以得到你想要的,无论是在连接之前还是之后调整形状。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-18
        • 2010-12-23
        • 2016-12-10
        • 2011-11-14
        • 2019-08-26
        • 1970-01-01
        • 2011-05-18
        • 2023-03-29
        相关资源
        最近更新 更多