Inverter e girar matriz numpy

Existe uma maneira mais rápida de inverter e girar uma matriz em numpy? Por exemplo, girando uma vez no sentido horário e depois girando?

import numpy as np a = np.arange(0,10) b = np.arange(-11,-1) ar = np.array([a,b]) print ar print ar.shape ar = np.rot90(ar, 3) print np.fliplr(ar) print ar.shape 

Saída:

 [[ 0 1 2 3 4 5 6 7 8 9] [-11 -10 -9 -8 -7 -6 -5 -4 -3 -2]] (2, 10) [[ 0 -11] [ 1 -10] [ 2 -9] [ 3 -8] [ 4 -7] [ 5 -6] [ 6 -5] [ 7 -4] [ 8 -3] [ 9 -2]] (10, 2) [Finished in 0.1s] 

PS: Esta questão não é uma duplicata de: Transpondo uma matriz NumPy . A presente questão não contesta a estabilidade da function “transpor”; está pedindo a function em si.

O código para np.rot90 faz, no seu caso de k=3 :

  # k == 3 return fliplr(m.swapaxes(0, 1)) 

assim

 In [789]: np.fliplr(ar.swapaxes(0, 1)) Out[789]: array([[-11, 0], ... [ -3, 8], [ -2, 9]]) 

Então seu

 fliplr(rot90(ar, 3)) 

torna-se

  np.fliplf(np.fliplr(ar.swapaxes(0, 1))) # the flips cancel ar.swapaxes(0,1) # but this is just ar.T 

Então, seu par de ações reduz a transposição.

transpose (e a swap ) apenas altera os atributos .shape e strides da matriz; é uma visão, não uma cópia.

np.fliplr também cria uma visualização, alterando os passos com o [:,::-1] .

O ar original:

 In [818]: ar Out[818]: array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [-11, -10, -9, -8, -7, -6, -5, -4, -3, -2]]) In [819]: x=np.fliplr(np.rot90(ar,3)) # your pair of actions In [820]: x Out[820]: array([[ 0, -11], [ 1, -10], ... [ 8, -3], [ 9, -2]]) In [821]: x[0,1]=11 In [822]: x Out[822]: array([[ 0, 11], [ 1, -10], ... [ 9, -2]]) In [823]: ar Out[823]: array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [ 11, -10, -9, -8, -7, -6, -5, -4, -3, -2]]) 

Alterar um valor de x altera um valor de ar . Apesar do uso de 2 funções, x ainda é uma view de ar .

As duas funções não são necessárias, mas também não são caras. Estamos falando de microssegundos por nanossegundos de tempo. (meus horários em Ipython são muito menores)

 In [824]: timeit np.fliplr(np.rot90(ar,3)) 100000 loops, best of 3: 8.28 µs per loop In [825]: timeit ar.T 1000000 loops, best of 3: 455 ns per loop 

Um flip e girar juntos (baseado em seu exemplo) é uma transposição de matriz : uma transposição de matriz é uma permutação das dimensões da matriz: por exemplo, a primeira dimensão se torna a segunda dimensão e vice-versa.

numpy suporta a function numpy.transpose :

 numpy.transpose(a, axes=None) 

Permute as dimensões de uma matriz.

parameters :

  • a : array_like : matriz de input.
  • axes : lista de ints, opcional Por padrão, inverta as dimensões, caso contrário, permute os eixos de acordo com os valores fornecidos.

Retorna :

  • p : ndarray : a com seus eixos permutados. Uma visão é retornada sempre que possível.

Isso será transpose :

 >>> import numpy as np >>> a = np.arange(0,10) >>> b = np.arange(-11,-1) >>> ar = np.array([a,b]) >>> ar.T array([[ 0, -11], [ 1, -10], [ 2, -9], [ 3, -8], [ 4, -7], [ 5, -6], [ 6, -5], [ 7, -4], [ 8, -3], [ 9, -2]]) >>> np.transpose(ar) array([[ 0, -11], [ 1, -10], [ 2, -9], [ 3, -8], [ 4, -7], [ 5, -6], [ 6, -5], [ 7, -4], [ 8, -3], [ 9, -2]])