[Python Note] 넘파이(NumPy) 이해하기 (1)
NumPy?
- 배열(array)를 사용해서 적은 메모리로 빠르게 데이터를 처리할 수 있는 module
- 특히 수학적 연산이 매우 빠르고 편리하다.
2. 배열(Array) 이해하기
- 보통 numpy는 간략히
np
로 쓰는데np.array()
로 배열을 만든다. np.array()
로 만들어진 배열의 type은numpy.ndarry
이다.- 리스트안에 리스트를 넣어 $n$차원 배열을 만들 수 있다.
import numpy as np
# 1차원 배열
arr1 = np.array([0, 1, 2, 3])
# 2차원 배열
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열
arr3 = np.array([[[1, 2],[3, 4]],[[5, 6],[7, 8]]])
3. 배열(Array)의 연산
- array와 list의 가장 큰 차이점 $\rightarrow$ 배열의 연산이 가능하다.
arr = np.array([1, 2, 3, 4, 5])
lst = [1, 2, 3, 4, 5]
print(f'배열 * 2 : {arr*2}')
print(f'리스트 * 2 : {lst*2}')
배열 * 2 : [ 2 4 6 8 10]
리스트 * 2 : [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
4. 배열(Array)의 차원과 크기
command | 설명 |
---|---|
ndim | 배열의 차원 크기를 반환 |
shape | 배열의 크기를 반환 |
- 리스트
[ ]
당 차원이 1개라고 생각하면 편하다. shape
는 수학에서 행렬과 같다. 첫 리스트에서 ‘,’가 될 때마다 다음 행이라고 생각하면 된다. 즉, 원소의 개수가 $n$개인 1차원 배열이다.- 한 예로
arr3
을 보면 첫 리스트에 2개의 리스트가 있고, 그 리스트 안에 또 2개의 리스트가 있다. 그리고 마지막으로 그 리스트 안에 4개의 원소가 있다. 그러면arr3.shape
은 차례대로(2, 2, 4)
가 되는 것이다.
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([[1, 2, 3],
[4, 5, 6]])
arr3 = np.array([[[1, 2, 3, 4],
[5, 6, 7, 8]],
[[9, 10, 11, 12],
[13, 14, 15, 16]]])
print(arr1.ndim, arr2.ndim, arr3.ndim)
print(arr1.shape, arr2.shape, arr3.shape)
1 2 3
(5,) (2, 3) (2, 2, 4)
5. 배열(Array)의 인덱싱 / 슬라이스
- 리스트
[ ]
안에 차원의 순서대로 인덱싱/슬라이싱을 하면된다. - 콤마 ‘,’로 구분해도 가능하다.
- 리스트
[ ]
한 덩어리를 행이라고 하고 덩어리 안의 같은 자리의 원소들을 열이라고 이해하자.
1) 인덱싱
# Example1. arr1에서 원소 4를 추출하자.
print(arr1[3])
# Example2. arr2에서 원소 5를 추출하자.
print(arr2[1][1], arr2[1, 1])
# Example3. arr3에서 원소 10을 추출하자.
print(arr3[1][0][1], arr3[1, 0, 1])
2) 슬라이싱
# Example1. arr1에서 원소 [2, 3, 4, 5]를 추출하자.
print(arr1[1:])
# Example2. arr2에서 원소 [4, 5, 6]를 추출하자.
print(arr2[1], arr2[1,:])
# Example3. arr3에서 원소 [13, 14, 15, 16]을 추출하자.
print(arr3[1][1], arr3[1, 1, :])
- 만약 각 차원에서 원소를 추출하고 싶다면?
# Example1. arr2에서 원소 [2, 5]를 추출하자.
print(arr2[:,1])
# Example2. arr3에서 원소 [[1, 5], [9, 13]]을 추출하자.
print(arr3[:, :, 0])
- 행(row)과 열(column)을 재배치할 수 있다.
arr2 = np.array([[1, 3, 2, 7],
[4, 8, 1, 2],
[4, 6, 9, 5]])
# Example1. 열의 순서를 2, 3, 0, 1열 순으로 바꿔보자.
arr2[:, [2, 3, 0, 1]]
# Example1. 열의 순서를 2, 1, 0열 순으로 바꿔보자.
arr2[[2, 1, 0],:]
3) 조건에 맞는 원소 추출
- 인덱스 안에 조건문을 입력하면 True인 배열만 추출된다.
# Example1. 짝수/홀수 찾기
arr1 = np.array([i for i in range(10)])
print(f'짝수 : {arr1[arr1 % 2 == 0]}')
print(f'홀수 : {arr1[arr1 % 2 == 1]}')
# Example2. 3과 5의 공배수 찾기
arr2 = np.array([i for i in range(100)])
print(f'3과 5의 공배수 : {arr2[(arr2 % 3 == 0) & (arr2 % 5 == 0)]}')
짝수 : [0 2 4 6 8]
홀수 : [1 3 5 7 9]
3과 5의 공배수 : [ 0 15 30 45 60 75 90]
댓글남기기