首页 > 解决方案 > 使用自定义排序进行 Numpy 重塑

问题描述

有没有办法对不是“C”或“F”的重塑功能进行自定义订单?

我想通过首先更改第二个索引,然后更改第三个索引,最后更改第一个索引来获取一个平面数组并使其成为 3 维数组?

例如像

a = np.arange(12).reshape((2, 2, 3), (2, 3, 1)) # Second parameter not real numpy

导致:

a[:,:,0] = [[0, 1], [6, 7]]
a[:,:,1] = [[2, 3], [8, 9]]
a[:,:,2] = [[4, 5], [10, 11]]

这似乎是非常普通的功能,但我似乎无法找到一种方法来做到这一点,而无需自己在循环中手动重塑它,这是不可取的。

谢谢你的帮助!

标签: pythonnumpyreshapenumpy-slicing

解决方案


首先,你生产了什么?

In [127]: a = np.zeros((2,2,2),int)
In [128]: a = np.zeros((2,2,3),int)
In [129]: a[:,:,0] = [[0, 1], [6, 7]]
     ...: a[:,:,1] = [[2, 3], [8, 9]]
     ...: a[:,:,2] = [[4, 5], [10, 11]]
In [130]: a
Out[130]: 
array([[[ 0,  2,  4],
        [ 1,  3,  5]],

       [[ 6,  8, 10],
        [ 7,  9, 11]]])

现在让我们尝试向后工作:

简单的重塑没有帮助:

In [131]: a.reshape(2,6)
Out[131]: 
array([[ 0,  2,  4,  1,  3,  5],
       [ 6,  8, 10,  7,  9, 11]])

但转置最后两个轴:

In [132]: a.transpose(0,2,1)
Out[132]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]]])
In [133]: a.transpose(0,2,1).reshape(2,6)
Out[133]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

所以在前进的方向:

In [135]: np.arange(12).reshape(2,3,2).transpose(0,2,1)
Out[135]: 
array([[[ 0,  2,  4],
        [ 1,  3,  5]],

       [[ 6,  8, 10],
        [ 7,  9, 11]]])

推荐阅读