1. 개념
* NumPy = Numerical Python
- Python에서 대규모 다차원 배열을 다룰 수 있게 도와주는 library
* 데이터의 대부분은 숫자 배열로 볼 수 있기에 NumPy는 꼭 필요
- 이미지나 소리 등 실생활 대부분이 숫자로 표현됨
* NumPy는 반복문 없이 배열 처리가 가능하며, python list에 비해 빠른 연산을 지원하고 메모리를 효율적으로 사용할 수 있다
* list)
list_arr = list(range(5))
print(list_arr) #[0,1,2,3,4] - comma로 구분
print(type(list_arr)) #<class 'list'>
* numpy)
- import 사용
- numpy 배열 생성 및 출력 형태 확인해 보면 ndarray가 생성됨을 확인할 수 있다.
- ndarray는 n차원의 배열(n-dimensional array)이다
import numpy as np #conventional 'np' alias
np_arr = np.array(range(5))
np_arr #array([0, 1, 2, 3, 4])
print(type(np_arr)) #<class 'numpy.ndarray'>
- 2차원 이상의 다차원 numpy ndarray 나타낼려면 중첩하면 된다.
#2-dimensional np array
arr2 = np.array([[1,2,3],[4,5,6]])
arr2
'''
array([[1, 2, 3],
[4, 5, 6]])
'''
#3-dimensional np array
arr3 = np.array([[[1,2,3],[4,5,6],[7,8,9]],
[[1,2,3],[4,5,6],[7,8,9]]])
arr3
'''
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])
'''
* 또한, numpy 배열은 여러 갈래의 입체적인 데이터 구조로, 데이터 방향을 axis로 표현한다.
* 행방향(높이) axis = 0, 열방향(폭) axis = 1, 채널 방향 axis = 2
2. 배열
[1] dtype
* array는 python list와 달리 같은 data type만 저장 가능하다
* dtype을 통해 float 형태로만 가능하며 float64임을 확인까지 가능
- astype()으로 배열 내의 모든 데이터를 다른 데이터 타입으로 변환 가능
arr = np.array([0,1,2,3,4],dtype=float)
print(arr) #[0. 1. 2. 3. 4.]
print(arr.dtype) #'float64'
print(arr.astype(int)) #[0 1 2 3 4]
dtype | 설명 | 다양한 표현 |
int | 정수형 타입 | i, int_, int32, int64, i8 |
float | 실수형 타입 | f, float_, float32, float64, f8 |
str | 문자열 타입 | str, U, U32 |
bool | 부울 타입 | ?, bool_ |
[2] 배열의 속성
* ndarray의 차원 관련 속성: ndim(몇 차원인지) & shape(양)
list = [0, 1, 2, 3]
arr = np.array(list)
print(arr.ndim) #1
print(arr.shape) #(4,)
list = [[0,1,2],[3,4,5]]
arr = np.array(list)
print(arr.ndim) #2
print(arr.shape) #(2,3)
* ndarray의 크기 속성 & shape 조절
arr = np.array([0,1,2,3,4,5])
print("arr.shape : {}".format(arr.shape)) # arr.shape : (6,)
print("배열 요소의 수 : {}".format(arr.size)) # 배열 요소의 수 : 6
print("배열의 길이 : {}".format(len(arr))) # 배열의 길이 : 6
- size는 배열 안에 들어가는 요소의 개수이며
- len은 세로 행 길이
- shape을 바꾸어 본다면
...
arr.shape = 3, 2
print("arr.shape : {}".format(arr.shape)) # arr.shape : (3,2)
print("배열 요소의 수 : {}".format(arr.size)) # 배열 요소의 수 : 6
print("배열의 길이 : {}".format(len(arr))) # 배열의 길이 : 3
3. indexing & slicing
[1] indexing
* indexing - 인덱스로 값을 찾아냄
* arange() method를 이용해서 배열을 만들 수 있음 ((하단) arange(7)이면 0부터 6까지의 정수로 구성된 배열을 만든다는 뜻)
* 배열은 index 0부터 시작함. 즉 아래 index 7은 범위에 벗어나서 오류
x = np.arange(7)
print(x) #[0 1 2 3 4 5 6]
print(x[3]) #3
print(x[7])
# IndexError: index 7 is out of bounds
x[0] = 10
print(x) # [10 1 2 3 4 5 6]
* (하단) arange method(1,13,1)이면 1부터 12까지 구성된 정수이되, 마지막 세번째 인자는 step으로 간격을 뜻한다. 즉 1부터 step 1씩의 간격으로 정수를 출력한다는 뜻
x = np.arange(1,13,1)
x.shape = 3,4
print(x)
#[[1 2 3 4]
[5 6 7 8]
[9 10 11 12]]
print(x[2,3]) #12
[2] slicing
* slicing - 인덱스의 값으로 배열의 일부분을 가져옴
* :(콜론) 앞 뒤로 공백이면 각각 처음이나 끝을 의미함
* 콜론을 기준으로 (콜론 뒤의 수 - 1)의 index까지의 수를 가져오면 된다.
* 콜론이 두 개 있으면 마지막 자리의 수는 '간격'을 뜻함
- 즉, 처음부터 시작해서 간격을 둔 해당 자리의 값을 출력하라는 뜻
x = np.arange(7)
print(x) # [0 1 2 3 4 5 6]
print(x[1:4]) #[1 2 3]
print(x[1:]) #[1 2 3 4 5 6]
print(x[:4]) #[0 1 2 3]
print(x[::2]) #[0 2 4 6]
- [:2:3]의 경우 index 0부터 2까지 가되 3을 간격으로 두기에 index 0만 해당
x = np.arange(1,13,1)
x.shape = 3,4
print(x)
#[[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]]
print(x[1:2,:2:3]) #[[5]]
print(x[1:,:2])
# [[5 6]
# [9 10]]
[3] Boolean Indexing
* Boolean indexing: 배열의 각 요소의 선택 여부를 boolean mask를 이용하여 지정하는 방식
- (1) 조건에 맞는 데이터를 가져오고 (2)참, 거짓을 알려준다
x = np.arange(7)
# Boolean mask True. False로 구성된 mask array
print(x) # [0 1 2 3 4 5 6]
print(x<3) #[True True True False False False False]
print(x>7) #[False False False False False False False]
* 또는 boolean mask의 True 요소에 해당하는 index만을 조회
x = np.arange(7)
print(x[x<3]) # [0 1 2]
print(x[x%2 == 0]) #[0 2 4 6]
[4] Fancy Indexing
* Fancy Indexing: 배열의 각 요소 선택을 index 배열을 전달하여 지정하는 방식 (대괄호가 두 번 선택됨)
* 즉, 찾고 싶은 자리 = index에 어떤 값이 있는 지 선택
- 내가 알고자 하는 자리의 index를 대입하여 해당 자리의 값을 구한다
x = np.arange(7)
print(x)
print(x[[1, 3, 5]]) #[1 3 5]
- x[[0,2]]의 경우 0번째와 2번째 행 출력
x = np.arange(1,13,1).reshape(3,4)
print(x[[0,2]])
#[[1 2 3 4]
# [9 10 11 12]]
[5] indexing & slicing
- 원하는 요소를 지정하기 위해 indexing과 slicing을 적절히 조합하여 사용이 가능하다
x = np.arange(1,13,1).reshape(3,4)
print(x[1:2,2]) #[7]
print(x[[0,2],2]) #[3 11]
print(x[[0,2],:2]) #[[1 2]
# [9 10]]
## numpy - 공식 docu() 보면서 numpy의 여러 기능들 posting에 담아서 올릴 예정! ## 🤗
* 출처1) 2021 NIPA/AI 기본/응용 교육과정
* 출처2)
- 강의명: 2023 DAS(디지털애널리틱스융합과정) 사전교육 - Python 기초
- 교수자: 이정원
'Python > Pandas&Numpy' 카테고리의 다른 글
pandas Tricks_02 👉🏻 'Select columns by Data Type' (Kevin by DataSchool) (0) | 2022.03.25 |
---|---|
list comprehension (0) | 2022.03.23 |
pandas functions - cut, qcut (0) | 2022.03.23 |
pandas Tricks_01 👉🏻 'Reverse (row/column) Order' (Kevin by DataSchool) (0) | 2022.03.23 |
Pandas (0) | 2022.03.21 |
댓글