1. 넘파이
1.1 넘파이란?
- 머신러닝의 알고리즘은 선형대수와 통계에 기반한다.
- Numerical Python 을 의미하는 NumPy는 선형대수 기반의 프로그램을 지원하는 패키지이다.
1.2 특징
- 루프를 사용하지 않고 대량 데이터의 배열 연산이 가능하므로 연산 속도가 빠르다.
- 파이썬 언어가 가지는 수행 성능의 제약이 있으므로 C/C++ 기반으로 코드를 작성하고 이를 넘파이에서 호출하는 방식으로 통합할 수 있다.
- 딥러닝 프레임워크인 텐서플로는 이러한 방식으로 배열 연산 수행 속도를 개선하고 넘파이와 호환된다.
- 행열 데이터의 가공과 변환 등은 파이썬의 대표적 데이터 처리 패키지인 판다스가 넘파이보다 더 편리하다.
2. ndarry
2.1 개요
넘파이의 기반 데이터 타입인 ndarray 을 이용해 다차원 배열을 생성하고 사용할 수 있다.
🥧 np.array()
리스트와 같은 인자를 입력 받아서 ndarray 로 변환한다.
🥧 shape
행과 열의 수를 알 수 있다.

- 차원
- ndarray.ndim으로 확인 가능
- [ ] : 1차원
- [[ ]] : 2차원
2.2 데이터 타입
- 같은 데이터 끼리만 연산 가능
- dtype 으로 데이터 타입 확인 가능
- astype 으로 ndarray내 데이터값의 타입 변경
- 만약, 다른 데이터 타입이 섞여 있으면, 크기가 더 큰 데이터 타입으로 형 변환이 된다.
int_array.astype('float64') #int 배열을 float로 바꾸기
2.3 생성 - arange, zeros, ones
🥧 arange(n)
0부터 n-1까지의 연속 숫자 값
np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
🥧 zeros(튜플의 shape) ones(튜플의 shape)
0 혹은 1 로 채운다.
zero_array=np.zeros((3,2), dtype='int32')
/* [[0 0]
[0 0]
[0 0]] */

2.4 변경 - reshape
- 특정 차원 및 크기로 변환
array1=np.arange(10)
array2=array1.reshape(2,5)

- 인자로 -1 을 사용하면 크기에 맞게 자동으로 변환 해준다.
array1=np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
array2=array1.reshape(-1,5) # (2, 5)로 자동 변환
- reshape (-1,1)
- 원본 ndarray가 어떤 형태라도 2차원이고, 여러 개의 row를 가지되 반드시 1개의 column을 가진 ndarray로 변환된다.
2.5 인덱싱
🥧 단일 값 추출
array1d=np.arange(start=1, stop=10)
array2d=array1d.reshape(3,3)
print('row=0, col=0) :', array2d[0,0])
print('row=0, col=1) :', array2d[0,1])


- row는 axis 0, column 은 axis 1로 표현하는 것이 정확하다.
- 3차원의 경우 axis 3은 높이를 가리킨다.
🥧 슬라이싱

- 연속한 데이터 추출
- 단일값 추출과 달리 슬라이싱, 팬시 인덱싱, 불린 인덱싱으로 추출된 뎅터 세트는 모두 ndarray 타입이다.
- 시작, 종료 인덱싱은 생략 가능
array2d[1:3,:]
/* [[4 5 6]
[7 8 9]] */
array2d[:,:]
/* [[1 2 3]
[4 5 6]
[7 8 9]] */
array2d[0]
/* [1 2 3] */
🥧 펜시 인덱싱
- 인덱스 집합을 지정하면 해당 위치의 인덱스에 해당하는 ndarray 반환
- array2d[[0,1],2] 의 경우 인덱싱이 (0,2) (1,2) 로 적용되어 [3.6]을 반환
🥧 불린 인덱싱
- 조건 필터링과 검색을 동시에 할 수 있다.
- array [조건]
array1d # [1 2 3 4 5 6 7 8 9]
array3=array1d[array1d>5] # [6 7 8 9]
2.6 행렬의 정렬 - sort, argsort
🥧 행렬 정렬 종류
| np.sort | ndarray.sort |
| 넘파이에서 호출 | 행렬 자체에서 호출 |
| 원 행렬은 유지. 원 행렬의 정렬된 행렬을 반환 | 원 행렬 자체를 정렬한 형태로 반환 |
- 기본적으로 오름차순
- 내림차순은 np.sort()[::-1]
🥧 2차원 행렬 정렬

array2d=np.array([[8,12],[7,1]])
sort_array2d_axis0=np.sort(array2d, axis=0)
print('로우 방향으로 정렬:\\n', sort_array2d_axis0)
sort_array2d_axis1=np.sort(array2d, axis=1)
print('칼럼 방향으로 정렬:\\n', sort_array2d_axis1)
🥧 정렬된 행렬의 인덱스 반환 argsort
org_array=np.array([3,1,9,5])
sort_indices=np.argsort(org_array) # [1 0 3 2]
2.7 선형대수 연산

🥧 행렬 곱 np.dot(행렬, 행렬)
🥧 전치 행렬 np.transpose(행렬)