2013-07-09 9 views
7

numpy 배열의 크기를 재정렬하고 싶습니다. 다음 코드는 작동하지만 너무 느립니다. 말했다numpy 배열의 순서 변경

new_im_vec = new_im.reshape(image_size**2 * 3) 

, 내가 new_im 필요하지 않습니다와 나는 단지 new_im_vec에 도착해야합니다

for i in range(image_size): 
    for j in range(image_size): 
     for k in range(3): 
      new_im[k, i, j] = im[i, j, k] 

이 후, 나는 new_im를 벡터화. 이 작업을 수행하는 더 좋은 방법이 있습니까? image_size은 약 256

+0

, 당신은'이 xrange' 대신 사용할 수있는 '쿨 – jh314

답변

10

, 당신은 하나의 명령에 배열 순서를 변경 할 수 있도록 주변의 축을 이동하는 기능. im 형상 있는 경우 나, J,

rollaxis(im, 2) 

형상 K, I, J 배열을 반환한다 케이.

이렇게하면 배열을 평평하게 할 수 있으며 ravel은이 목적을위한 명확한 기능입니다. 모두 함께이 퍼팅, 당신은 멋진 한 줄을 가지고 : 당신이 Python2를 사용하는 경우

new_im_vec = ravel(rollaxis(im, 2)) 
+0

을 range'! 그것은 작동합니다. 내가해야 할 다른 일은 첫 번째 차원을 비추는 것입니다. a [1, :, :]와 [3, :, :]을 교환하십시오. 이 기능이 있습니까? –

+1

@ Mohammad Moghimi, 귀하의 질문을 올바르게 이해할 경우 flipdy를 사용하여 배열을 가로 축 주위로 뒤집을 수 있습니다. a [:: - 1, :, :]도 작동해야합니다. –

+2

+1 아마도 가장 좋은 옵션입니다. 완성을 위해,'np.transpose (im, (2, 0, 1)) '을하는 옵션 (실제로'np.rollaxis'에 의해 호출된다고 생각합니다)이 있습니다. 참고로'np.rollaxis' 또는'np.transpose'는 원래 데이터의 뷰를 반환하지만, 뷰에서 flatten을 호출하면 복사본이 트리거 될 가능성이 있습니다. – Jaime

7
new_im = im.swapaxes(0,2).swapaxes(1,2) # First swap i and k, then i and j 
new_im_vec = new_im.flatten() # Vectorize 

이 swapaxes 오히려 요소를 통해 복사하는 것보다, 배열에 뷰를 반환하기 때문에 훨씬 더 빠르게 처리 될 수 있습니다.

물론 new_im을 건너 뛰고 싶다면 한 줄에서 처리 할 수 ​​있으며 여전히 flatten 만 복사 중입니다. 체크 아웃 rollaxis

new_im_vec = im.swapaxes(0,2).swapaxes(1,2).flatten()