Python 将第N维度中的项目拆分并交换到第N+1维度

Python 将第N维度中的项目拆分并交换到第N+1维度,python,numpy,numpy-ndarray,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中是否有任何函数可以用来

假设我有一个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.Reformate已关闭,但不完全是因为它无法交换项。
我希望避免使用纯python,因为这段代码用于为神经网络输入格式化一些数据,并且给定实际数组大小的python速度可能是一个瓶颈。

拆分最后一个轴,然后排列轴-

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的新轴-

对于每个列表的元素数已知的一般情况,例如n,它将是-

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

拆分最后一个轴,然后排列轴-

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的新轴-

对于每个列表的元素数已知的一般情况,例如n,它将是-

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

你很接近。然后,您只需交换第三和第四个轴:

>>> 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]]]])

你很接近。然后,您只需交换第三和第四个轴:

>>> 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]]]])

您可以要求重塑以使用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]]]])

您可以要求重塑以使用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]]]])

虽然这个答案直接解决了我的问题,但Divakar的答案更一般,并且可能对阅读此问题的人更有用。虽然这个答案直接解决了我的问题,但Divakar的答案更一般,并且可能对阅读此问题的人更有用。