Numpy
- Numerical Python의 약자로 숫자로 이루어진 배열을 다루기 위한 파이썬의 라이브러리
- 파이썬의 list에 비해 규모가 큰 다차원 배열의 저장 및 처리에 훨씬 효율적
- pandas 등 다양한 데이터 처리 라이브러리에서 사용됨
Numpy array의 생성
# numpy 사용하기
import numpy as np
# numpy를 이용하여 array 정의하기
arr = [1, 2, 3, 4, 5]
n_arr = np.array(arr)
print(n_arr) # [1 2 3 4 5]
Numpy array의 특징
- Numpy 배열은 생성 이후 크기를 변경할 수 없음 => 변경이 있을 시 새로 생성해야 함
- list보다 메모리 공간을 덜 차지함
- Numpy 배열의 모든 요소는 같은 타입이어야 함
- 타입이 일치하지 않을 경우 가능한 상위 타입을 취함
- 정수 < 실수 < 문자열
import numpy as np
arr = ['3.14', 2., 3., 5]
n_arr = np.array(arr)
print(arr) # ['3.14', 2.0, 3.0, 5]
print(type(arr)) # <class 'list'>
print(n_arr) # ['3.14' '2.0' '3.0' '5']
print(type(n_arr)) # <class 'numpy.ndarray'>
위 코드에서 문자열, 실수, 정수가 섞인 list를 numpy array로 생성하니 모든 요소가 문자열 타입으로 자동 변경되었다.
명시적으로 데이터 타입을 지정하기 위해서는 dtype 속성을 사용한다.
import numpy as np
arr = [1, 2., 3.5]
print(np.array(arr, dtype='int64')) # [1 2 3]
※ Numpy array의 표준 데이터 타입
Numpy array의 속성
- n_arr.ndim
- array의 차원의 수를 확인 - n_arr.shape
- array의 모양을 튜플 형태로 반환
n_arr = np.array([1, 2, 3, 4, 5])
n_arr2 = np.array([[1, 4, 2], [7, 5, 3]])
print(n_arr.shape) # (5,) => 1차원이며 크기5의 array
print(n_arr2.shape) # (2, 3) => 2차원이며 2행 3열 크기의 array
- n_arr.size
- array의 항목의 수
※ 2차원 Numpy array 배열의 값 접근
- 배열명[행, 열] 또는 배열명[행][열]
nums = np.array([[1, 4, 2], [7, 5, 3]])
print(nums[1, 1]) # 5
print(nums[1, :2]) # [7, 5]
print(nums[:, 2:]) # [[2] [3]]
print(nums[:, :2]) # [[1 4] [7 5]]
※ 다차원 배열의 슬라이싱의 경우 범위로 슬라이싱 할 때와 특정 행/열을 슬라이싱 할 때의 shape가 다름에 유의
nums = np.array([[1, 4, 2], [7, 5, 3]])
print(nums[0:1, ]) # [[1 4 2]]
print(nums[0:1, :]) # [[1 4 2]]
print(nums[0, :]) # [1 4 2]
※ Numpy array의 경우 배열에 대한 검색 / 슬라이싱 결과는 참조만 할당
즉, 기존 배열이 변경될 경우 값이 같이 변경된다. 따라서 독립적으로 사용해야할 경우 copy() 함수를 사용한다.
nums = np.array([1, 4, 2, 5, 3])
ref = nums[1:4] # [4 2 5]
cpy = nums[1:4].copy() # [4 2 5]
nums[2] = 7
print(ref) # [4 7 5]
print(cpy) # [4 2 5]
Numpy 내장 함수를 이용한 배열 생성
- np.zeros(shape)
- 모든 값이 0인 배열 생성 - np.ones(shape)
- 모든 값이 1인 배열 생성 - np.full(shape, value)
- 모든 값이 value로 초기화된 배열 생성 - np.identity(size)
- 크기가 size x size인 단위행렬 생성 - np.eye(size, k=n)
- 크기가 size x size인 단위행렬 생성 후 k만큼 이동 - np.random.random(shape)
- 0과 1 사이의 임의의 숫자로 초기화된 배열 생성 - np.arange(start, stop, step, dtype=' ')
- start부터 stop전까지 step 단위로 배열에 값을 생성
Numpy array의 형태 변형
- reshape(shape)
- 기존 배열을 shape 형태로 변형
- 단, 기존 배열과 새로운 배열의 요소 수는 동일해야함 - n_arr.T
- 기존 행렬의 전치행렬(행과 열이 뒤바뀐 행렬) 반환
- 함수가 아닌 속성 - swapaxes(axis1, axis2)
- 축1과 축2를 서로 맞바꿈
- n_arr.swapaxes(0, 1) == n_arr.T - transpose(shape)
- 변형 후 축의 index를 순서대로 기재
- 한 번에 여러 개의 축을 바꿀 수 있음
Numpy array의 병합
- concatenate([array1, array2, ...], axis=n)
- 해당 axis 방향으로 array를 순서대로 연결
- axis의 default 값은 0(수직 방향) - vstack([array1, array2, ...])
- 수직 방향으로 array 순서대로 연결 - hstack([array1, array2, ...])
- 수평 방향으로 array 순서대로 연결
Numpy array의 분할
- split(array, 분할 지점의 리스트)
- 분할 지점의 리스트를 기준으로 array를 분할
x = np.arange(10)
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3) # [0 1 2] [3 4] [5 6 7 8 9]
# 2차원 배열의 분할
x = np.arange(16).reshape((4, 4))
upper, lower = np.split(x, [2], axis=0)
print(upper)
print(lower)
# [[0 1 2 3]
# [4 5 6 7]]
# [[ 8 9 10 11]
# [12 13 14 15]]
- vsplit(), hsplit()
- 각각 수직방향, 수평방향으로 분할
Numpy의 연산
Numpy 배열의 연산에서는 연산 대상인 두 배열들의 차원이 같은 경우 각 요소 단위로 연산을 수행한다.
a = np.array([0, 1, 2])
b = np.array([5, 5, 5])
print(a + b) # [5 6 7]
브로드캐스팅(Broadcasting)
브로드캐스팅이란 연산 대상 둘 중 하나가 스칼라 값인 경우 배열로 확장 혹은 복제 후 처리하는 것이다.
a = np.array([0, 1, 2])
b = 5
print(a + b) # [5 6 7]
※ 브로드캐스팅 규칙
- 두 배열의 차원 수가 다르면 더 작은 수의 차원을 가진 배열의 shape 앞에 1을 추가하여 두 배열의 차원을 같게 만듬
- 두 배열 중 한 배열의 차원이 1인 배열은 다른 배열의 shape와 일치하도록 늘어남
- 1번 2번 규칙을 모두 적용한 뒤에도 shape이 서로 다르면 브로드캐스팅에 실패
첫 번째 그림에서 (3, ) 짜리 배열과 (1, ) 짜리 배열의 연산에서 2번 규칙에 따라 (1, )이 (3, )으로 늘어난 뒤 연산이 수행된다. 두 번째 그림에서는 1번 규칙에 따라 (3, ) 배열이 (1, 3) 배열이 된 후 2번 규칙에 따라 (3, 3) 으로 늘어난 뒤 연산이 수행된다. 세 번째 그림에서는 1번 규칙에 따라 (3, )짜리 배열이 (1, 3) 배열이 된 후 2번 규칙에 따라 (3, 1) 배열과 (1, 3) 배열 모두 (3, 3)로 늘어난 뒤 연산이 수행된다.
'Python > 파이썬 라이브러리' 카테고리의 다른 글
[파이썬 라이브러리] bisect (0) | 2022.02.02 |
---|---|
[파이썬 라이브러리] collections (0) | 2022.01.28 |
[파이썬 라이브러리] math (0) | 2021.12.30 |
[파이썬 라이브러리] itertools (0) | 2021.12.30 |
[파이썬 라이브러리] 내장 함수 (0) | 2021.12.29 |