[Python] Numpy 완전정복1 - ndarray 기초
Numpy 완전정복1 - ndarray 기초
파이썬을 사용하는 분석가, 개발자라면 무조건 사용하게 되는 필수 라이브러리인 Numpy의 기초적인 문법에 대해 정리하고 자주 사용하게 될 유용한 함수들을 정리해두었습니다!
Numpy(넘파이)란?
- Numeric + Python의 약자로 수학, 과학 연산에 필요한 함수를 제공하는 라이브러리
- 다차원 배열을 다룰 때 주로 사용합니다. (인공신경망, 비정형 데이터 처리, 자연어 처리)
- 파이썬 기본 문법에 비해 연산 속도가 빠르고 함수를 활용해 더 간결한 코드 작성이 가능합니다.
Numpy의 ndarray 다루기
넘파이에서는 파이썬 리스트와 비슷한 구조의 데이터 타입을 지원합니다.
이중 구조의 배열이나 행렬처럼 사용이 가능하며, 수학적 연산 또한 가능합니다.
1. ndarray 데이터 만들기
ndarray 자료형을 만들고, 데이터 정보를 확인할 수 있는 코드들은 다음과 같습니다.
변수명 = np.array([변수에 넣을 데이터])
type(변수명)
import numpy as np #라이브러리 불러오기
arr = np.array([1,2,3,4,5])
type(arr) #데이터 타입 확인: numpy.ndarray
arr2 = np.array([arr, arr, arr]) #하나의 데이터를 중복으로 이용해 새로운 데이터를 만들 수 있음
일정한 규칙에 따라 ndarray 데이터를 만들고 싶을 경우, range와 유사한 np.arange 함수를 사용할 수 있습니다.
변수명 = np.arange(시작점, 끝점+1, 간격)
#np.arange - ndarray 수열을 만들어주는 함수
arr = np.arange(15, 31, 5) #[15, 20, 25, 30]
2. ndarray 크기, 모양 살펴보기
생성된 데이터의 모양, 크기에 대해 살펴볼 수 있는 코드들은 다음과 같습니다.
변수명.shape #row, column 수 튜플로 반환
변수명.ndim #차원 수 반환, 다차원 여부 확인
변수명.size #원소의 개수 반환
arr.shape #(row, column)
arr.ndim #차원 수
arr.size #원소 수
3. ndarray 수정
1) 새로운 값 추가
이미 생성된 데이터에 새로운 값을 추가하고 싶을 경우 np.append를 사용합니다.
변수명 = np.append(변수명, 추가할 값, axis = (1 혹은 0))
값을 행에 추가하고 싶을 경우 axis = 0
값을 열에 추가하고 싶을 경우 axis = 1을 넣어줍니다.
*2차원 이상의 데이터에 append를 할 경우, 차원이 맞지 않으면 에러가 발생하기 때문에 주의해야 합니다!
arr = np.append(arr, 25) #값 추가
#2차원 행렬 데이터의 경우
arr2 = np.array([[1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]])
arr3 = np.append(arr2, [2,3,4,5,6], axis = 0) #4행 데이터 추가
arr4 = np.append(arr2, [[2], [3], [6]], axis = 1) #[2,3,6]으로 이루어진 6열 추가
2) 모양 변경
변수명.reshape(row, column)
위 메소드를 통해 배열의 모양을 변경할 수 있습니다.
배열의 모양을 바꿀 때는 기존 변수에 있던 원소를 모두 담을 수 있도록 모양을 맞춰주어야 합니다.
reshape 메소드에서 row 혹은 column에 원하는 값을 지정하고 나머지를 -1로 지정하면
해당 옵션에 맞는 모양을 알아서 계산해서 반환해주기 때문에 하나의 옵션만 지정하여 편리하게 사용할 수 있습니다.
c = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]]) #4*3 행렬 생성
c.reshape(6,2) #12개의 원소를 담을 수 있는 6*2 행렬로 변경
c.reshape(-1, 4) #column = 4로 지정했을 때 만들 수 있는 row를 알아서 계산하여 변경
변수명.flatten()
위 메소드를 이용하면 변수를 평탄화하여 1차원으로 만들 수 있습니다.
flatten 메소드는 함수에 데이터를 넣어야 하는데 차원이 지원되지 않는 경우 등에서
flatten().reshape()로 데이터를 바꿔주는 방식으로 유용하게 사용할 수 있습니다.
변수명.transpose() or 변수명.T
위 메소드를 사용하면 행렬의 경우 전치행렬을 반환합니다.
전치행렬은 행과 열을 교환하여 얻는 행렬을 뜻합니다.
열과 행 단위로 연산을 진행하거나 병합을 진행할 때 위 메소드를 이용합니다.
4. ndarray 연산
Numpy에서는 연산을 쉽게 할 수 있도록 다양한 함수들을 지원합니다.
arr.sum() #합계
arr.max() #가장 큰 값 찾기
arr.min() #가장 작은 값 찾기
arr.mean() #평균
arr.ptp() #최댓값 - 최솟값
또한 Numpy에서는 데이터의 각 원소에 직접 접근하지 않고도 개별적인 연산을 수행할 수 있습니다.
예를 들어, arr + 5를 수행하면 arr의 각 원소에 모두 5를 더한 데이터를 반환합니다.
ndarray 데이터의 모든 원소에 특정한 연산을 하고 싶을 때 '변수명에 연산자를 바로 붙여 사용'하면 원하는 값을
쉽고 빠르게 얻을 수 있습니다.
arr + 10 #모든 원소에 10을 더해줌
arr / 5 #모든 원소를 5로 나눠줌
arr ** 2 #모든 원소를 제곱함
5. ndarray의 자료형
ndarray 내의 원소들은 연산을 수행하려면 동일한 데이터 타입을 가져야 합니다. (int, str, float ...)
데이터 타입이 다르거나, 타입을 바꿔주기 위해서는
np.array([변수에 넣을 데이터], '자료형') 을 사용합니다.
np.array(np.arange(0, 10, 0.1), 'float32')
데이터가 차지하는 용량을 줄이고 싶다면 기본형인 int64, float64 대신 int32, float32를 사용할 수 있습니다.
ndarray에서는 정수(int), 실수(float), 문자열(str)외에도
True/False(bool), 부호없는 정수형(unit), 복소수형(complex128)을 지원합니다.
6. 인덱싱, 슬라이싱
ndarray에서는 전체 데이터 내에서 특정 데이터만 선택하기 위해 인덱싱과 슬라이싱을 이용합니다.
예를 들어 3차원 배열에서 특정 데이터를 선택하기 위해서는
1) arr[a][b][c] - 인덱싱 방법
2) arr[a:a+1, b:b+1, :] - 슬라이싱 방법
위 두가지 방법을 사용할 수 있으며 이때 괄호 속 각각의 자리는 순서대로 [장, 행, 열]을 의미합니다.
구체적으로,
인덱싱 방법은 특정 위치를 인덱스 번호를 이용해 직접 지정해주는 방법이며
슬라이싱 방법은 [시작점:끝점+1]을 통해 특정 범위의 데이터를 가져올 수 있는 방법입니다.
실제로 데이터를 가져올 때에는 인덱싱 방법과 슬라이싱 방법을 혼용하여 사용하는 것이 가장 편리합니다.
a1 = [[[10, 11, 12],
[13, 14, 15],
[16, 17, 18]],
[[20, 21, 22],
[23, 24, 25],
[26, 27, 28]],
[[30, 31, 32],
[33, 34, 35],
[36, 37, 38]]] #3차원 배열
#3장만 가져오고 싶을 때
a1[2] #인덱싱
a1[2, :, :] #슬라이싱
#모든 장의 1행, 2행만 가져오고 싶을 때
a1[:, :2, :] # a1[:, :2]와 동일
#모든 장의 2-3행, 2열만 가져오고 싶을 때
a1[:, 1:, 1] #슬라이싱, 슬라이싱, 인덱싱
숫자를 통한 인덱싱뿐만 아니라 bool type을 통해 데이터를 가져올 수도 있습니다.
인덱스 자리에 조건을 넣으면 조건을 만족하는(True) 데이터만 가져올 수 있습니다.
arr[True, False를 반환하는 조건]
예를 들어 a[a>14]로 불린 인덱싱을 진행하면 조건에 맞는 데이터만 반환합니다.