在NumPy中反转3D矩阵的所有子矩阵

时间:2016-07-14 17:22:02

标签: python arrays numpy matrix

我有一个3x5x5"矩阵" (实际上是3D numpy.ndarray)。为了我需要执行的一些计算,我必须首先反转这个3D数组的每个子数组,如下所示:

>>> x = np.arange(75).reshape(3, 5, 5)
>>> x
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19],
        [20, 21, 22, 23, 24]],

       [[25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39],
        [40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49]],

       [[50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59],
        [60, 61, 62, 63, 64],
        [65, 66, 67, 68, 69],
        [70, 71, 72, 73, 74]]])

>>> np.array([ np.rot90(k, 2) for k in x ])
array([[[ 24.,  23.,  22.,  21.,  20.],
        [ 19.,  18.,  17.,  16.,  15.],
        [ 14.,  13.,  12.,  11.,  10.],
        [  9.,   8.,   7.,   6.,   5.],
        [  4.,   3.,   2.,   1.,   0.]],

       [[ 49.,  48.,  47.,  46.,  45.],
        [ 44.,  43.,  42.,  41.,  40.],
        [ 39.,  38.,  37.,  36.,  35.],
        [ 34.,  33.,  32.,  31.,  30.],
        [ 29.,  28.,  27.,  26.,  25.]],

       [[ 74.,  73.,  72.,  71.,  70.],
        [ 69.,  68.,  67.,  66.,  65.],
        [ 64.,  63.,  62.,  61.,  60.],
        [ 59.,  58.,  57.,  56.,  55.],
        [ 54.,  53.,  52.,  51.,  50.]]])

正如您所看到的,我找到了一个似乎最初运行良好的解决方案(使用np.rot90)。但是,在对较大输入进行测试时,此方法变得非常缓慢,尤其是当第一维超过100时。是否有更快/更有效的方法来执行此操作?

谢谢!

1 个答案:

答案 0 :(得分:1)

沿着axes 1,2反转,从而避免循环,并希望在那里获得一些性能提升。因此,可以简单地实现所需的输出 -

x[:,::-1,::-1]