Tengo el siguiente conjunto de formas de Numpy (4, 4, 3):

a = [[[ 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]]]

Estoy buscando una solución elegante para reorganizar los elementos en esa matriz para obtener la siguiente matriz 3D de formas (3, 4, 4):

a_new = [[[ 0  3  6  9]
          [12 15 18 21]
          [24 27 30 33]
          [36 39 42 45]]

         [[ 1  4  7 10]
          [13 16 19 22]
          [25 28 31 34]
          [37 40 43 46]]

         [[ 2  5  8 11]
          [14 17 20 23]
          [26 29 32 35]
          [38 41 44 47]]]
1
Ehsan Khaveh 13 ene. 2017 a las 17:57

3 respuestas

La mejor respuesta

Utilice np.transpose -

a.transpose(2,0,1)

O utilice np.rollaxis -

np.rollaxis(a,2,0) # Or np.rollaxis(a,-1,0)
2
Divakar 13 ene. 2017 a las 14:59

En caso de que alguien haga la misma pregunta para Python puro:

mylist = [[[1,2,3], [4,5,6]], [[7,8,9], [10, 11, 12]]]
flat = sum(sum(mylist, []), [])
groups = 3
print [flat[r::groups] for r in range(groups)]

[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]

0
Hubert Grzeskowiak 13 ene. 2017 a las 16:10

La forma más rápida que se me ocurre es usar la función swapaxes de numpy en combinación con la función de transposición.

anew=np.swapaxes(a,0,1).T
1
alexblae 13 ene. 2017 a las 15:07