In [1]:
import numpy as np
아래 모양의 2차원 어레이가 있다.
$$\left [ \begin{matrix} 1 & 11 & 21 & 31 & 41\\ 3 & 13 & 23 & 33 & 43\\ 5 & 15 & 25 & 35 & 45\\ 7 & 17 & 27 & 37 & 47\\ 9 & 19 & 29 & 39 & 49 \end{matrix} \right ] $$위 모양의 어레이를 구현하는 하나의 방식은 arange를 이용하여 1차원 어레이를 구현한 다음에
reshape 함수를 이용하여 원하는 모양의 2차원 어레이를 생성하는 것이다. 즉,
np.arange(1, 50, 2).reshape(5, 5).T
In [2]:
x = np.random.rand(10,3)
이제 생성된 어레이의 각 항목들과 0.5 사이의 거리를 계산한다.
In [3]:
a= np.abs(x - 0.5)
argsort를 이용하여 어레이 x의 각 행별로 0.5로부터 가장 가까운 값의 위치를 알아낸다.
In [4]:
b = a.argsort()[:,0]
위 정보를 이용하여 x의 각 행별로 0.5로부터 가장 가까운 값이 얼마인지를 다음과 같아 알아낼 수 있다.
In [5]:
min05 = x[np.arange(10), b]
In [6]:
from scipy import misc
import matplotlib.pylab as plt
%pylab inline
아래 사이트에 가면 "Lena" 이름의 여성 사신에 대한 설명을 확인할 수 있다.
http://www.cs.cmu.edu/~chuck/lennapg/
위 사이트에서 확인되는 사진은 이미지 압축 알고리즘과 관련해서 가장 많이 사용되는 사진이다.
파이썬에서는 scipy 모듈에서 2차원 어레이 형식으로 Lena 사진 데이터를 제공한다.
In [7]:
lena = misc.lena()
lena
Out[7]:
In [8]:
plt.imshow(lena, cmap='gray')
Out[8]:
Lena의 얼굴 영역을 타원으로 감싸보자.
타원 바깥 부분은 검은색으로 처리한다.
목걸이 장식으로 사용할 로켓(locket) 처럼 처리하는 내용이다.
예를 들어 가운데 부분을 원으로 처리하면 아래처럼 보이게 할 수 있다.
참고로, 중심이 (a, b)이고 x축의 반지름이 c, y 축의 반지름이 d인 타원의 방정식은 다음과 같다.
((x - a)/c)**2 + ((y - b)/d)**2 = 1
위 사진을 얻기 위해서 먼저 lena 사진의 픽셀 크기와 동일한 격자판을 이용하여 마스크를 생성해야 한다.
가로, 세로 각각 512인 격자판을 다루기 위해서는 행과 열을 담당하는 어레이 x와 y를 다음과 같이 생성한다.
In [9]:
x = np.arange(512)
y = np.arange(512)[:, np.newaxis]
In [11]:
lena[mask]=0
plt.imshow(lena, cmap='gray')
Out[11]:
In [12]:
data = np.loadtxt('../excs/data/populations.txt')
data
Out[12]:
data는 2차원 어레이이며 모양은 (21,4) 이다.
.