In [1]:
import numpy as np
In [2]:
from matplotlib import pyplot as plt
%pylab inline
먼저 아래의 행렬에 해당하는 어레이를 생성한다.
$$ a = \left [ \begin{matrix} 0 & 0 & 0 \\ 10 & 10 & 10 \\ 20 & 20 & 20\\ 30 & 30 & 30 \end{matrix} \right ]$$
In [3]:
a = np.tile(np.arange(0, 40, 10), (3,1)).T
a
Out[3]:
이제 아래 모양의 어레이를 생성한다.
$$b = \left [ \begin{matrix} 0 & 1 & 2 \end{matrix} \right ]$$
In [4]:
b = np.array([0, 1, 2])
b
Out[4]:
a
와 b
의 합을 실행하기 위해 먼저 b
를 확산하여 a
의 모양과 맞춘다.
In [5]:
a + b
Out[5]:
이제 아래 모양의 덧셈이 어떻게 실행되는지 살펴보자.
$$ \left [ \begin{matrix} 0\\ 10\\ 20\\ 30 \end{matrix} \right ] + \left [ \begin{matrix} 0 & 1 & 2 \end{matrix} \right ] $$먼저 아래 행렬에 해당하는 어레이를 생성하자.
$$ \left [ \begin{matrix} 0\\ 10\\ 20\\ 30 \end{matrix} \right ] $$위 행렬에 해당하는 어레이는 (4, 1)
모양의 2차원 어레이임에 주의해야 한다.
In [6]:
c = np.array([0, 10, 20, 30]).reshape((4,1))
c
Out[6]:
이제 c + b
를 실행하기 위해서는 c
와 b
각각을 (4,3)
모양으로 확산해야 한다.
c
의 경우: (4,1)
모양의 어레이 이므로 열을 2칸 늘려야 한다. 즉, b
의 경우: (3,)
모양이므로 행 방향으로 3칸 틀려야 한다. 즉,
In [7]:
c + b
Out[7]:
어레이와 숫자의 연산은 사실 확산을 사용한 것이다.
In [8]:
a = np.ones((4,5))
a
Out[8]:
a[0] = 2
를 실행하면 a
의 0번 행의 값들을 모두 2로 교체하는데 이는 실제로는
a[0] = array[2, 2, 2, 2, 2]
를 실행하는 것이다.
즉, 확산을 먼저 실행한 후에 교체를 진행한다.
In [9]:
a[0] = 2
a
Out[9]:
In [10]:
a = np.arange(0, 40, 10)
a
Out[10]:
In [11]:
a.shape
Out[11]:
In [12]:
a = a[:, np.newaxis]
In [13]:
a.shape
Out[13]:
In [14]:
a
Out[14]:
In [15]:
mileposts = np.array([0, 198, 303, 736, 871, 1175, 1475, 1544, 1913, 2448])
즉, Chicago와 Springfield 사이의 거리는 198마일이고 Chicago와 Los Angeles 사이의 거리는 2448마일이다.
이제 임이의 두 도시 사이의 거리를 구해보자. 확산과 빼기, 절대값 연산을 이용하면 쉽게 구할 수 있다.
In [16]:
distance_array = np.abs(mileposts - mileposts[:, np.newaxis])
위 결과는 격자판(그리드, grid) 모양의 어레이이다.
In [17]:
distance_array
Out[17]:
예를 들어, Santa Fe와 Flagstaff 사이의 거리는 distance_array[7, 9]
이다.
In [18]:
distance_array[7, 9]
Out[18]:
아래 좌표들로 구성된 점들의 집합을 고려해보자.
$$ A= \left \{ \begin{matrix} (0,0), & (0,1), & (0,2), & (0, 3), & (0,4), \\ (1,0), & (1,1), & (1,2), & (1, 3), & (1,4), \\ (2,0), & (2,1), & (2,2), & (2, 3), & (2,4), \\ (3,0), & (3,1), & (3,2), & (3, 3), & (3,4), \\ (4,0), & (4,1), & (4,2), & (4, 3), & (4,4) \end{matrix} \right \}$$위 점들 각각에 대해 원점으로부터의 거리를 구해보자. 즉, 아래 그림에서 표시된 각 점들과 원점사이의 거리를 구해보자.
In [19]:
x = np.repeat(np.arange(0, 5), 5)
y = np.tile(np.arange(0, 5), 5)
plt.scatter(x,y, s=100 ,marker='o')
plt.grid()
plt.show()
앞서의 예제와 같이 격자판(grid) 모양의 데이터를 분석하는 방식으로 처리할 수 있다. 즉, 차원 늘리기와 확산을 이용한다.
먼저 위 좌표들은 아래 두 개의 어레이들의 이용한 순서쌍으로 만들 수 있음에 주목한다.
In [20]:
x = np.arange(5)
x
Out[20]:
In [21]:
y = np.arange(5)[:, np.newaxis]
y
Out[21]:
왜냐하면 x
와 y
의 각각의 항목값을 좌표로 갖는 점들이 위 그림에서 표시된 점들이기 때문이다.
그리고 각 점들의 원점으로부터의 거리는 피타고라스 정리에 의해 결정된다.
예를 들어, (a, b)
의 좌표를 갖는 점은 원점으로부터의 거리가
이다. 따라서 아래와 같이 각 점의 원점으로부터의 거리를 구할 수 있다.
주의: 확산이 자동으로 사용된다.
In [22]:
distance = np.sqrt(x ** 2 + y ** 2)
distance
Out[22]:
참고로, 위 좌표값들의 집합 $A$는 다음과 같은 방식으로 구해질 수 있다.
In [23]:
A = np.transpose([np.repeat(np.arange(5), 5), np.tile(np.arange(5), 5)])
A
Out[23]:
이제 원점으로부터의 거리를 색깔로 표시하여 거리정도를 확인할 수도 있다.
넘파이의 pcolor
함수를 이용하면 된다.
In [24]:
plt.pcolor(distance)
plt.colorbar()
Out[24]:
위 그림에서 원점으로부터 떨어진 정도에 따라 색깔이 결정됨을 알 수 있다. 즉, 짙은 남색에 가까울 수록 원점으로부터의 거리가 가깝고, 짙은 빨강에 가까울 수록 원점으로부터의 거리가 멀다.