데이터 분석 삼대장 - (2) Numpy

넘파이(Numpy)

넘파이(Numpy) -수치 데이터를 다루는 파이썬 패키지. Numpy의 핵심이라고 불리는 다차원 행렬 자료구조인 ndarray를 통해 벡터 및 행렬을 사용하는 선형 대수 계산에서 주로 사용된다.

Numpy는 편의성 뿐만아니라 속도면에서도 순수 파이썬에 비해 압도적으로 빠르다는 장점이 있다.

Numpy 설치하기

아나콘다를 설치했다면 자동적으로 같이 되어있지만, 설치하지 않았다면 아래와 같이 별도로 설치할 수 있다.

1
pip install numpy

Numpy의 경우, 주로 np라는 명칭으로 임포트 하는 것이 관례이다.

1
import numpy as np

Numpy의 주요 모듈

Numpy의 주요 모듈은 아래와 같다.

  1. np.array() : 리스트, 튜플, 배열로부터 ndarray를 생성
  2. np.asarray() : 기존 array로부터 ndarray를 생성
  3. np.arange() : range와 비슷
  4. np.linspace(start, end, num) : [start, end] 균일한 간격으로 num개 생성
  5. np.logspace(start, end, num) : [start, end] log scale 간격으로 num개 생성

1) np.array()

numpy의 핵심은 ndarray라고 할 수 있다. np.array()는 리스트, 튜플, 배열로부터 ndarray를 생성한다. 또한 인덱스가 항상 0으로 시작한다는 특징을 가지고 있다.

우선 파이썬 자료구조 중 하나인 리스트를 가지고 1차원 배열을 생성해보도록 하자.

1
2
3
a = np.array([1, 2, 3, 4, 5])
print(type(a))
print(a)
1
2
<type 'numpy.ndarray'>
array([1, 2, 3, 4, 5])

타입이 numpy.ndarray라고 나오고 있으며, 배열로 생성되었음을 알 수 있다. 2차원 배열도 리스트 안에 리스트를 넣는 방식으로 생성하면 된다.

1
2
b = np.array([10, 20, 30], [60, 70, 80])
print(b)
1
2
array([10, 20, 30],
    [60, 70, 80])

2차원 배열이 생성되었음을 알 수 있다. 행렬의 차원 및 크기를 ndim 속성과 shape 속성으로 출력할 수 있다.

1
2
print(b.ndim) #차원 출력
print(b.shape) #크기 출력
1
2
2
(2, 3)

위의 결과는 각각 2차원이며 2x3 행렬임을 보여준다. 가령 앞서 만들었던 1차원 배열 a에 대해서 차원 및 크기를 출력하면 아래와 같다.

1
2
1
(5, )

각각 1차원과 크기 5의 배열임을 보여준다.

(2) ndarray의 초기화

위에서는 리스트를 가지고 ndarray를 생성했지만 ndarray를 만드는 다양항 방법이 존재한다. zeros()는 해당 배열에 모두 0을 삽입하고 ones()는 모두 1을 삽입한다. full()은 배열에 사용자가 지정한 값을 넣는데 사용하고, eye()는 대각선으로는 1이고 나머지는 0인 2차원 배열을 생성한다.

1
2
a = np.zeros((2, 3)) # 모든 값이 0인 2x3 배열 생성
print(a)
1
2
[[0. 0. 0.]
 [0. 0. 0.]]
1
2
a = np.ones((2, 3)) #모든 값이 1인 2x3 배열 생성
print(a)
1
2
[[1. 1. 1]
 [1. 1. 1]]
1
2
a = np.full((2, 2), 7) #모든 값이 특정 상수인 배열 생성. 이 경우에는 7
print(a)
1
2
[[7 7]
 [7 7]]
1
2
a = np.eye(3)
print(a)
1
2
3
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
1
2
a = np.random.random((2, 2)) #임의의 값으로 채워진 배열 생성
print(a)

(3) np.arrange()

np.arrange()는 지정해준 범위에 대해서 배열을 생성한다. np.array()의 범위 지정 방법은 아래와 같다.

numpy.arrange(start, stop, step, dtype)

1
2
3
4
5
a = np.arrange(10) #0, ..., n-1까지 범위의 지정
print(a)

b = np.arrange(1, 10, 2) #1부터 9까지 +2씩 적용되는 범위
print(b)
1
2
[0 1 2 3 4 5 6 7 8 9]
[1 3 5 7 9]

reshape()

1
2
a = np.array(np.arrange(30)).reshape((5, 6))
print(a)

위의 예제는 0부터 n-1까지의 숫자를 생성하는 arrange(n) 함수에 배열을 다차원으로 변형하는 reshape()를 통해 배열을 생성한다.

1
2
3
4
5
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]]

Numpy 슬라이싱

ndarray를 통해 만든 다차원 배열은 파이썬의 리스트처럼 슬라이스(slice) 기능을 지원한다. 슬라이스 기능을 사용하면 원소들 중 복수 개에 접근할 수 있다.

1
2
3
4
5
6
a = np.array([1, 2, 3], [4, 5, 6])
b = a[0:2, 0:2] #부분 슬라이스
print(b)
c = a[0, :] #첫번째 행 출력
print(c)
d = a[:, 1] #두번째 열 출력
1
2
3
4
[[1 2]
 [4 5]]
[1 2 3]
[2 5]

Numpy 정수 인덱싱(integer indexing)

정수 인덱싱은 원본 배열로부터 부분 배열을 구한다.

1
2
3
a = np.array([[1, 2], [4, 5], [7,8]])
b = a[[2, 1], [1,0]]
print(b)
1
[8 4]

Numpy 연산

Numpy를 사용하면 배열간 연산을 손쉽게 수행할 수 있다. +, -, * / 의 연산자를 사용할 수 있으며 또는 add(), substract(), multiply(), divide() 함수를 사용할수도 있습니다.

1
2
3
4
5
6
7
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

b = x + y #각 요소를 더함
print(b)
c = x - y #각 요소를 빼기
print(c)
1
2
[5 7 9]
[-3 -3 -3]

위에서 *를 통해 수행한 것은 요소별 곱이었습니다. Numpy에서 벡터와 행렬의 곱 또는 행렬곱을 위해서는 dot()을 사용해야 합니다.

1
2
3
4
5
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

c = np.dot(a, b)
print(c)
1
2
[[19 22]
 [43 50]]