将第N维的项目拆分和交换到Nth + 1维

时间:2019-10-05 20:29:09

标签: python numpy numpy-ndarray

假设我有一个像这样的numpy数组:

[[[ 1,  2,  3,  4],
  [ 5,  6,  7,  8],
  [ 9, 10, 11, 12],
  [13, 14, 15, 16]]]

尺寸为(1、4、4)

我想将其转换为:

[[[[ 1,  3], [ 2,  4]],
  [[ 5,  7], [ 6,  8]],
  [[ 9, 11], [10, 12]],
  [[13, 15], [14, 16]]]]

尺寸为(1、4、2、2)。

numpy中是否有任何可以用来修改数组的函数?

  • array.reshape()很接近,但并不完全是因为它不能交换项目。

我想避免使用直接python,因为此代码用于格式化神经网络输入的某些数据,并且python的速度(考虑到实际数组的大小)可能会成为瓶颈。

3 个答案:

答案 0 :(得分:1)

分割最后一个轴,然后置换轴-

In [41]: a
Out[41]: 
array([[[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12],
        [13, 14, 15, 16]]])

In [42]: a.reshape(-1,2,2).swapaxes(1,2)
Out[42]: 
array([[[ 1,  3],
        [ 2,  4]],

       [[ 5,  7],
        [ 6,  8]],

       [[ 9, 11],
        [10, 12]],

       [[13, 15],
        [14, 16]]])

如果您需要最终输出形状为(1,4,2,2),请使用None/np.newaxis在前面添​​加新轴-

In [43]: a.reshape(-1,2,2).swapaxes(1,2)[None]
Out[43]: 
array([[[[ 1,  3],
         [ 2,  4]],

        [[ 5,  7],
         [ 6,  8]],

        [[ 9, 11],
         [10, 12]],

        [[13, 15],
         [14, 16]]]])

In [44]: _.shape
Out[44]: (1, 4, 2, 2)

对于一个已知每个列表的元素数为n的一般情况,它应该是-

a.reshape(-1,n,a.shape[-1]//n).swapaxes(1,2)[None]

More info onnd-arraystransformation.

答案 1 :(得分:1)

您非常亲密。然后,您唯一需要做的就是交换第三和第四轴:

>>> np.swapaxes(a.reshape(1,4,2,2), 2,3)
array([[[[ 1,  3],
         [ 2,  4]],

        [[ 5,  7],
         [ 6,  8]],

        [[ 9, 11],
         [10, 12]],

        [[13, 15],
         [14, 16]]]])

答案 2 :(得分:1)

您可以要求重塑以使用FORTRAN命令:

a = np.arange(1,17).reshape(1,4,4)

a.reshape(*a.shape[:-1],2,2,order="F")
# array([[[[ 1,  3],
#          [ 2,  4]],
# 
#         [[ 5,  7],
#          [ 6,  8]],
# 
#         [[ 9, 11],
#          [10, 12]],
# 
#         [[13, 15],
#          [14, 16]]]])