본문 바로가기

데이터과학

파이썬의 컴퓨팅 라이브러리 - 넘파이(NumPy)

 

파이썬의 컴퓨팅 라이브러리 - 넘파이(NumPy)

 

- Numerical Python의 줄임말로 파이썬에서 컴퓨팅과 데이터 분석 등에 이용
- 배열을 만들고 연산을 하고 랜덤 넘버 생성
- 구조화된 데이터나 표형식의 데이터 분석 시 이용

 

넘파이(Numpy)는 수치 데이터를 다루는 파이썬 패키지입니다. Numpy의 핵심이라고 불리는 다차원 행렬 자료구조인 ndarray를 통해 벡터 및 행렬을 사용하는 선형 대수 계산에서 주로 사용됩니다. Numpy는 편의성뿐만 아니라, 속도면에서도 순수 파이썬에 비해 압도적으로 빠르다는 장점이 있습니다.

 

아나콘다를 설치하지 않았다면 아래의 커맨드로 Numpy를 별도 설치할 수 있습니다.

pip install numpy

> ipython

...

In [1]: import numpy as np

In [2]: np.__version__

Out[2]: '1.16.5'

Numpy의 경우, 주로 np라는 명칭으로 임포트하는 것이 관례입니다. 아래 모든 실습들은 Numpy를 임포트하였다고 가정하겠습니다.

import numpy as np

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차원 배열을 생성해보도록 하겠습니다.

a = np.array([1, 2, 3, 4, 5]) #리스트를 가지고 1차원 배열 생성

print(type(a))

print(a)

<type 'numpy.ndarray'>

array([1, 2, 3, 4, 5])

타입이 numpy.ndarray라고 나오고 있으며, 배열로 생성되었음을 알 수 있습니다. 이제 2차원 배열을 만들어보도록 하겠습니다. 한가지 주의할 점은 array() 안에 하나의 리스트만 들어가므로 리스트의 리스트를 넣어야 합니다.

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

print(b) #출력

array([[10, 20, 30],

       [60, 70, 80]])

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

print(b.ndim) #차원 출력

print(b.shape) #크기 출력

2

(2, 3)

위의 결과는 각각 2차원이며, 2 X 3 행렬임을 보여줍니다. 가령, 앞서 만들었던 1차원 배열 a에 대해서 차원 및 크기를 출력하면 다음과 같습니다.

print(a.ndim) #차원 출력

print(a.shape) #크기 출력

1

(5,)

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

2) ndarray의 초기화

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

a = np.zeros((2,3)) # 모든값이 0 2x3 배열 생성.

print(a)

[[0. 0. 0.]

 [0. 0. 0.]]

a = np.ones((2,3)) # 모든값이 1 2x3 배열 생성.

print(a)

[[1. 1. 1.]

 [1. 1. 1.]]

a = np.full((2,2), 7) # 모든 값이 특정 상수인 배열 생성. 경우에는 7.

print(a)

[[7 7]

 [7 7]]

a = np.eye(3) # 대각선으로는 1이고 나머지는 0 2차원 배열을 생성.

print(a)

[[1. 0. 0.]

 [0. 1. 0.]]

 [0. 0. 1.]]

a = np.random.random((2,2)) # 임의의 값으로 채워진 배열 생성

print(a)

[[0.3111881  0.72996102]

 [0.65667734 0.40758328]]

3) np.arange()

np.arange()는 지정해준 범위에 대해서 배열을 생성합니다. np.arange()의 범위 지정 방법은 다음과 같습니다.

numpy.arange(start, stop, step, dtype)
a = np.arange(n) # 0, ..., n-1
까지 범위의 지정.
a = np.arange(i, j, k) # i
부터 j-1까지 k씩 증가하는 배열.

a = np.arange(10) #0부터 9까지

print(a)

[0 1 2 3 4 5 6 7 8 9]

a = np.arange(1, 10, 2) #1부터 9까지 +2 적용되는 범위

print(a)

[1 3 5 7 9]

4) reshape()

a = np.array(np.arange(30)).reshape((5,6))

print(a)

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

[[ 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]]

5) Numpy 슬라이싱

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

import numpy as np

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

b=a[0:2, 0:2]

print(b)

다차원 배열을 슬라이싱하기 위해서는 각 차원 별로 슬라이스 범위를 지정해줘야 합니다.

[[1 2]

 [4 5]]

b=a[0, :] # 첫번째 출력

print(b)

[1 2 3]

b=a[:, 1] # 두번째 출력

print(b)

[2 5]

6) Numpy 정수 인덱싱(integer indexing)

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

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

b = a[[2, 1],[1, 0]] # a[[row2, row1],[col1, col0]] 의미함.

print(b)

[8 4]

7) Numpy 연산

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

x = np.array([1,2,3])

y = np.array([4,5,6])

b = x + y # 요소에 대해서 더함

# b = np.add(x, y) 동일함

print(b)

[5 7 9]

b = x - y # 요소에 대해서 빼기

# b = np.subtract(x, y) 동일함

print(b)

[-3 -3 -3]

b = b * x # 요소에 대해서 곱셈

# b = np.multiply(b, x) 동일함

print(b)

[-3 -6 -9]

b = b / x # 요소에 대해서 나눗셈

# b = np.divide(b, x) 동일함

print(b)

[-3. -3. -3.]

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

a = np.array([[1,2],[3,4]])

b = np.array([[5,6],[7,8]])

 

c = np.dot(a, b)

print(c)

[[19 22]

 [43 50]]

출처 https://wikidocs.net/32829