Numpy를 사용하는 이유
--> 반복문 없이 배열 처리 가능함.
--> 리스트에 비해 빠른 연산을 지원하고 메모리를 효율적으로 사용가능하다.
list 배열 생성
list(range(5) --> [0, 1, 2, 3, 4] 생성
타입은 list
numpy 배열 생성
numpy 호출: import numpy as np
np.array(range(5)) --> [0 1 2 3 4] 생성 (공백으로 구분됨)
print(type(np.array(range(5)))) --> <class 'numpy.ndarray'>생성
- numpy는 같은 데이터 타입만 저장 가능
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] # int형으로 변환
ndarray 관련 속성
list -> 넘파이 형태로
list[[0, 1, 2], [3,4,5]]
arr = np.array(list)
print(arr.ndim) --> 2
print(arr.shape) --> (2, 3)
print(arr.shape) --> (2,3)
print(arr.size) --> 6 # 배열 요소 개수
print(len(arr)) --> 6 # 배열 길이
Indexing
x = np.arange(7) --> [0 1 2 3 4 5 6]
print(x[3]) -- > 3
print(x[7]) --> IndexError: index 7 is out of bounds
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
Slicing
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칸씩 slicing
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]]
Boolean Indexing
x = np.arange(7)
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]
print(x[x < 3]) [0 1 2]
print(x[x % 2 == 0]) [0 2 4 6]
Fancy Indexing
: 배열의 각 요소 선택을 Index 배열을 전달하여 지정하는 방식
x = np.arange(7)
print(x) --> [0 1 2 3 4 5 6]
print(x[[1, 3, 5]]) [1 3 5]
x = np.arange(1, 13 ,1).reshape(3, 4)
print(x) --> [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]
print(x[[0, 2]]) --> [[ 1 2 3 4] [ 9 10 11 12]]
print(x[1:2, 2]) --> [7] # 1행~1행 2열
print(x[[0,2], 2]) --> [ 3 11] # 0행 2행의 각각 2열 값
print(x[[0,2], :2]) [[ 1 2] [ 9 10]] # 0행 2행의 각각 0열,1열 값