2016-06-28 3 views
1

numpy에서 배열을 뒤집기 및 회전하는 더 빠른 방법이 있습니까? 예를 들어 시계 방향으로 한 번 회전 한 다음 뒤집기를할까요?numpy 배열을 뒤집기 및 뒤집기

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 

출력 :

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

P.S :이 질문은의 중복되지 않습니다 : Transposing a NumPy array. 현재의 질문은 "전치"기능의 안정성을 논쟁하지 않는다. 그것은 기능 자체를 요구하고 있습니다.

+2

'np.transpose()', 별명'ar.T' (Ipython 내 timeit 시간은 훨씬 작은 당신입니다). –

답변

2

np.rot90의 코드는 k=3의 귀하의 경우, 수행합니다

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

그래서

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

그래서 당신

fliplr(rot90(ar, 3)) 

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

그래서 행동의 당신의 쌍 트랜스을 감소된다.

transpose (및 swap)은 배열의 .shapestrides 속성을 변경합니다. 보기가 아닌 사본입니다.

np.fliplr[:,::-1]으로 스트라이드를 변경하는보기를 만듭니다.

원래 ar

:

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

x의 값을 변경하면 ar의 값을 변경한다. 2 가지 기능을 사용하더라도 x은 여전히 ​​viewar입니다.

2 가지 기능은 필요하지 않지만 값 비싸지 않습니다. 우리는 마이크로 초 v 나노초의 시간을 이야기하고 있습니다.

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 
+0

얼마나 빨리 보여 주신 것을 축하드립니다. – cpicanco

1

뒤집기 및 함께 회전 (예제에 따라)은 matrix transpose입니다. 행렬 전치는 행렬의 차원의 순열입니다. 예를 들어 첫 번째 차원은 두 번째 차원이되고 그 반대의 경우도 마찬가지입니다.

numpy.transpose(a, axes=None) 

이것은 Permute 배열의 치수 :

numpy.transpose 기능을 지원한다. 파라미터

:

  • a : array_like : 입력 어레이.
  • axes : int리스트, 선택 사항 기본적으로 치수를 반대로 지정하고, 그렇지 않으면 주어진 값에 따라 축을 치환합니다.

반환 :

  • p : ndarray : 순열의 축과 함께. 가능한 경우 뷰가 리턴됩니다.
1

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