본문 바로가기
파이썬(데이터 분석)/평균값(mean)계산 실습

[파이썬] numpy, matplotlib를 활용한 천문학/우주과학 데이터 실습 평균값 - 1

by 루껍 2022. 2. 12.
반응형

안녕하세요. 저번 포스팅에 이어서 fits파일을 직접 활용하여 데이터의 평균(mean)을 계산해보겠습니다.

 

import numpy as np
from astropy.io import fits
import matplotlib.pyplot as plt

필요한 라이브러리를 불러옵니다.

 

 

hdulist = fits.open('fits_images_all/image0.fits')

hdulist.info()

data = hdulist[0].data

print(data)

 

본격적인 실습을 진행하기 전에, 하나의 fits파일을 열어 데이터 프레임과 데이터를 확인합니다.

먼저, 데이터의 크기가 200 x 200 pixel이라는 점에 주목하고, 각 픽셀에 저장된 하나의 값(픽셀값)을 출력하여 확인해봅니다.

 

 

plt.imshow(data)
plt.show()

plt.imshow(data, 'gray')
plt.show()

앞선 과정에서 배열 형태로 저장된 수치적 데이터를 확인했으니, 이번엔 데이터를 시각화하여 확인해보겠습니다.

먼저 원본 data를 보면, (100,100) 부근의 픽셀값이 유별나다는 것을 알 수 있습니다.

 

아래 그림은 원본 데이터를 흑백으로 출력한 결과입니다. 역시 (100,100) 부근의 픽셀값이 튀는 것을 볼 수 있습니다.

 

 

실습에 사용할 5개의 fits 데이터를 모두 시각화하여 확인해보았습니다.

자세히 보면 각 이미지의 (100,100) 부근의 픽셀값의 변화가 있는 것을 확인할 수 있는데요, 이에는 관측대상의 종류, 관측기기의 한계 등 다양한 원인이 있을 수 있습니다. 

 

이에 대한 자세한 내용은 추후에 다뤄보기로 하고, 지금은 데이터의 계산, 평균계산에 집중하겠습니다.

 

 

final_data = 0

for i in range(5):
    
    hdulist = fits.open('fits_images_all/image{}.fits'.format(i))
    data = hdulist[0].data
    
    final_data = final_data + data 
    
mean = final_data / 5

print('(100,100)에서의 픽셀값 평균:',mean[100,100])

반복문을 통해서 5개의 fits파일에 대한 (100,100)에서의 픽셀값의 평균을 계산해보았습니다

위 코드의 일부를 자세히 보겠습니다.

 

 

final_data = 0

for i in range(5):
    
    hdulist = fits.open('fits_images_all/image{}.fits'.format(i))
    data = hdulist[0].data
    
    final_data = final_data + data

처음에 final_data = 0 으로 선언해줍니다.

그 이유는 final_data라는 변수에 각 fits파일의 데이터를 차곡차곡 쌓기 위함입니다!

 

반복문이 한번 실행될 때마다 data라는 변수에 저장되는 값이 변하게 되고, 그 저장된 값이 '바로 직전'의 final_data수치적으로 더해져 새로운 final_data를 생성하게 되는 것입니다.

 

('바로 직전'final_data) + (data) => 새로운 final_data가 되는 형태라면, 첫번째 반복문에 대한 final_data는 반복문안에 존재하지 않기 때문에 초기에 final_data = 0 으로 선언해주는 것입니다.

 

즉, 첫번째 반복문에서의 final_data는 data와 동일해지며, 이 때 생성된 final_data위에다음 반복문부터 쭉 생성되는 data 정보가 더해지게 되는 것입니다. 

 

 

hdulist = fits.open('fits_images_all/image0.fits')
data = hdulist[0].data

print(type(data))

여기까지의 설명을 따라오셨다면, 데이터의 형태에 대해서 다음과 같은 궁금증이 생기실 수 있습니다.

반복문 안에서 'data'라는 변수에 저장된 데이터는 '배열'의 형태이고, 맨 처음의 final_data라는 변수에 저장된 데이터는 0이라는 숫자인데 어떻게 되는거지? 

 

그에 대한 해답은 data의 tpye을 출력해보면 알 수 있습니다. 

출력문에서 확인할 수 있듯이, data의 형태는 numpy 배열이기 때문에 벡터화 연산이 가능합니다!

 

 

final_data = 0
final_list = [] 

for i in range(5):
    
    hdulist = fits.open('fits_images_all/image{}.fits'.format(i))
    data = hdulist[0].data
    
    final_list.append(data[100,100])
    print('image{}.fits 데이터의 (100,100) 픽셀값:'.format(i),data[100,100])
       
    final_data = final_data + data 
    
mean = final_data / 5

print('final_list:', final_list)
print('final_data로 확인한 (100,100)에서의 픽셀값 평균:',mean[100,100])
print('final_list로 확인한 (100,100)에서의 픽셀값 평균:',np.mean(final_list))

 

마지막으로, final_list라는 빈 리스트를 생성하여, 반복문이 진행될 때마다 각 fits 데이터의 (100,100)의 픽셀값을 저장하여 앞서 계산한 평균값과 일치하는지 확인하는 검토과정을 진행하였고, 일치함을 확인했습니다.

 

감사합니다.

반응형

댓글