본문 바로가기

코딩/파이썬과 데이터 사이언스

파이썬과 데이터 사이언스 : NumPy 라이브러리

 

numpy는 다차원 배열의 연산 및 수치 연산을 위한 다양한 기능을 제공합니다.

 

아래는 numpy의 array() 함수를 이용해 numpy 배열(ndarray : n-dimension array)을 생성하는 코드입니다.

 

import numpy as np

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

print(data)
print(type(data))
print(data.dtype)
print(data.shape)

 

 

다음은 파이썬의 기본 자료 구조인 list와 ndarray의 처리 시간 비교 코드입니다.

각 요소에 2를 더하는 처리 시간은 사용 PC에 따라 차이가 날 것입니다.

 

import numpy as np
import time


data1 = [x for x in range(100000)]
data2 = np.array(data1)

t1 = time.time()
for i in range(len(data1)):
    data1[i] += 2
print(time.time() - t1)
print(data1[-1])

t1 = time.time()
data2 = data2 + 2
print(time.time() - t1)
print(data2[-1])

 

 

아래의 표는 다차원 배열 생성을 위해 사용할 수 있는 함수의 예입니다.

 

numpy.arange() arange([start, ]stop, [step, ]dtype=None, *, like=None)

입력된 조건을 기반으로 배열을 생성. start ~ stop 사이 정수 개의 배열 생성
numpy.array() array(p_object, dtype=None, *args, **kwargs)

입력된 데이터를 기반으로 배열을 생성
numpy.asarray 입력 데이터를 배열로 변환. 입력 데이터가 ndarray이면 데이터는 복사되지 않음
numpy.empty()
또는 numpy.empty_like()
empty(shape, dtype=None, order='C', *args, **kwargs)
-> shape : 2 또는 (2, 3) 등 배열 차원 및 요소의 개수

입력된 shape 및 dtype에 따라 배열을 생성하지만 각 요소의 값은 초기화하지 않음.
따라서 각 요소의 값은 임의의 값으로 채워짐
numpy.eye()
또느 numpy.identity()
eye(N, M=None, k=0, dtype=float, order='C', *, like=None)
-> N : 행을 개수
-> M : 열의 개수

왼쪽 위부터 오른쪽 아래 (대각선) 방향으로 1값, 나머지 영역은 0값으로 초기화
numpy.ones()
또는 numpy.ones_like()
ones(shape, dtype=None, order='C', *, like=None)
-> shape : 2 또는 (2, 3) 등 배열 차원 및 요소의 개수

입력된 shape 및 dtype에 따라 배열을 생성하고 그 값을 1로 초기화

ones_like(a, dtype=None, order='K', subok=True, shape=None)

입력된 a와 동일한 shape 및 dtype을 가지는 배열을 생성하고 그 값을 1로 초기화
numpy.random.rand() rand(*dn)
-> rand(d0, d1, ..., dn) -> rand(2, 3) 등 배열 차원 및 요소의 개수

입력된 조건에 따라 랜덤한 값을 가지는 배열을 생성 (균등분포)
numpy.random.randn() 입력된 조건에 따라 랜덤한 값을 가지는 배열을 생성 (표준정규분포)
numpy.random.randint() randint(low, high=None, size=None, dtype=None)
-> size : 2  또는 (2, 3) 등 배열 차원 및 요소의 개수

입력된 조건에 따라 랜던한 값을 가지는 배열을 생성 (값은 int 타입)
numpy.reshape() reshape(self, shape, order='C')
-> shape : 2 또는 (2, 3) 등 배열 차원 및 요소의 개수

입력된 조건에 따라 배열의 차원을 변경
reshape((2, 3)) 과 reshape(2, 3)은 동일한 결과를 가짐
numpy.zeros()
또는 numpy.zeros_like()
zeros(shape, dtype=None, order='C', *args, **kwargs)
-> shape : 2 또는 (2, 3) 등 배열 차원 및 요소의 개수

입력된 shape 및 dtype에 따라 배열을 생성하고 그 값을 0으로 초기화

 

astype() 메서드를 이용하면 배열 각 요소에 적용되어 있는 타입을 변경할 수 있습니다.

 

import numpy as np

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

print(data1)
print(data1.dtype)
print()

data2 = data1.astype('int8')
data2[-1] += 100
print(data2)
print(data2.dtype)
print()

print(data1[-1])
print(data2[-1])

 

 

정수 (signed) int8, int16, int32, int64
정수 (unsigned) uint8, uint16, uint32, uint64
부동 소수점 float16 (반 정밀도)
float32 (단 정밀도)
float64 (배 정밀도)
float128 (확장 정밀도)
복소수 complex64
complex128
complex256
불리언 bool (True, False)
object 파이썬 객체
string_ 고정 길이 문자열
unicode_ 고정 길이 유니코드

 

배열 내 데이터 접근 시 인덱스(index) 또는 슬라이싱(slicing) 사용이 가능합니다. 마지막 코드는 팬시 인덱싱(fancy indexing)의 예입니다.

 

import numpy as np

data = np.arange(1, 17).reshape(4, 4)

print(data)
print()

print(data[2][2])
print(data[2, 2])
print(data[:2])

# print(data[[0, 2, 3][1]])  # fancy indexing

 

 

아래는 배열 내 데이터 접근 시 특정 조건을 만족하는 값만 추출하는 코드입니다. 이러한 방식을 불리언 인덱싱(boolean indexing)으로 부르기도 합니다.

 

import numpy as np

data = np.random.randint(1, 100, 20)

print(data)
print()

print(data > 80)
print()

print(data[data > 80])

 

 

다음은 numpy가 제공하는 산술 연산 함수의 예입니다. -> 사용 예. numpy.add(data1, data2)

 

add(x1, x2) 더하기 mean(a) 평균값
argmax(a) 최대값의 인덱스 min(a) 최소값
argmin(a) 최소값의 인덱스 sqrt(x) 제곱근
cumsum(x) 누적 합계 square(x) 제곱
exp(x) 지수승 std(a) 표준편차
log(x) 로그 sum(a) 합계
max(a) 최대값 var(a) 편차

 

numpy에서 축을 변경하는 방법은 transpose() 함수 또는 T 속성을 사용하는 것입니다.

 

import numpy as np

data = np.arange(10).reshape(2, 5)

print(data)
print()

print(data.transpose())
print()

print(data.T)