2012-11-08 4 views
0

나는 이미지에서 데이터가 부족한 배열을 만들었다. numpy 배열을 1 차원 배열로 변환하고 싶습니다.왜 내 배열이 바뀌지 않습니까?

import numpy as np 
import matplotlib.image as img 

if __name__ == '__main__': 

    my_image = img.imread("zebra.jpg")[:,:,0] 
    width, height = my_image.shape 
    my_image = np.array(my_image) 
    img_buffer = my_image.copy() 
    img_buffer = img_buffer.reshape(width * height) 
    print str(img_buffer.shape) 

이미지는 128x128입니다.

enter image description here

그러나,이 프로그램은 인쇄 출력 (128, 128). 그래도 img_buffer은 1 차원 배열이 되길 원합니다. 이 배열을 어떻게 변형합니까? numpy가 실제로 배열을 1 차원 배열로 재 형성하지 않는 이유는 무엇입니까?

+0

컬러 이미지가있는 것처럼 보이지만 이미지의 각 픽셀에 대한 빨간색 채널 만 읽는 중입니다. 그것이 당신의 의도입니까? –

+0

감사! 내 원래의 의도는 모든 RGB를 읽는 것입니다. 왜 내가 빨간 채널을 읽는거야? – dangerChihuahua007

+1

@DavidFaux wim이 말한 것처럼 정확한 코드를 가지고 질문을 신속하게 편집 했으므로 다시 변경하십시오. 이 코드가 작동하는 이유는 "왜이 기능이 작동하지 않습니까?"라는 질문을하는 것이 완전히 혼란 스럽습니다. – seberg

답변

1

reshape이 작동하지 않습니다. reshape에 의해 반환 된 값을 img_buffer에 다시 할당하지 않기 때문에 코드가 작동하지 않습니다.

배열을 한 차원으로 병합하려면 ravel 또는 flatten을 사용하는 것이 더 쉬운 옵션 일 수 있습니다.

>>> img_buffer = img_buffer.ravel() 
>>> img_buffer.shape 
(16384,) 

그렇지 않으면, 당신은하고 싶은 것 :

>>> img_buffer = img_buffer.reshape(np.product(img_buffer.shape)) 
>>> img_buffer.shape 
(16384,) 

또는 더 간결을 :

>>> img_buffer = img_buffer.reshape(-1) 
>>> img_buffer.shape 
(16384,) 
+0

아 감사합니다! 'ravel()'이 트릭을했습니다! – dangerChihuahua007

2

.reshape 오히려 장소에 재편보다, 새로운 배열을 반환합니다.

그런데 이미지의 바이트 테스트를 시도하는 것 같습니다. 아마도 my_image.tostring()을 사용하고 싶을 것입니다.

+1

질문에있는 코드로 제안 사항을 업데이트하는 것은 실제적으로 권장되지 않습니다. 질문 및 답변의 문맥이 잘못되어 향후 독자를 도울 수 없기 때문입니다! – wim

관련 문제