우선 이번 주차 설명에 앞서서..
학교 강의에서 나오는 실습 예제나 stack overflow나 다른 사람들의 numpy 코드를 보면
for loop, 즉 반복문을 numpy에선 잘 쓰지 않는다.
심지어 실습 문제에는 그냥 대놓고 for문 쓰지 말 것~이라고 주어지길래
왜 그런건지 찾아보니 for loop를 쓰면 numpy 함수를 쓴 것보다 속도가 상당히 느리다.
그래서 얼마나 느린 건지 직접 검증해보았다.
- numpy.arange를 통해 리스트를 만든 경우
0~999999 배열을 만드는 데에 6.49ms 가 걸렸다.
- for loop 를 통해 리스트를 만든 경우
동일한 크기의 배열을 만드는 데에 398ms 가 걸렸다.
실험 결과 약 50배가량의 시간 차이가 나버리는 것을 볼 수 있는데,
왜 그런것인지는 numpy의 기능들을 생각하면 알 수 있다.
numpy는 대규모 수학 연산들을 하기 위해 만들어졌기 때문에, 이 많은 수들을 가지고
수치해석을 하거나, 통계 관련 기능을 구현하는데에 용이하며 가장 기본이 되는 모듈이다.
따라서 빠른 연산과 편리함이 전제가 되어있지 않았다면 우리가 지금 공부할 필요도 없을 것이다. 까비..
따라서 numpy를 사용하는데 굳이 python의 for loop를 쓰는 건 비상식적 행위이다.
그럼 이번주는 numpy에서 Matrix가 주어졌을 때 모양(shape)을 확인하는 법과 index 하는 법을 배우고
Matrix 각각의 element들을 어떻게 가지고 노는지 알아보도록 하자.
1. Matrix shape
- np.shape(mat) : mat(행렬)을 인자로 받아 이 행렬의 모양(row & column)을 출력해준다.
a의 출력값은 정수 0부터 8까지 순서대로 3 x 3 행렬에 넣은 결과입니다.
- 행과 열의 길이 구하기
a = [[0,1,2], [3,4,5]] 이기 때문에, 행의 개수를 구하려면 a의 원소를 구하는 것이고,
열의 개수를 구하려면 a의 원소 안에 있는 원소들의 개수를 구하는 것이다.
(처음 2차원 배열을 배울 때를 생각하면 됩니다.)
2. Matrix indexing
본격적으로 Matrix 안의 element 들을 자유자재로 다루어 보자!
- Matrix에서 행(row) 구하기
위에서 행의 길이를 구한 것과 달리 행 자체를 보려면
a[row_idx]로 행을 하나하나 indexing 해주어야 합니다.
- Matrix에서 열(column) 구하기
열을 구하는 것이 살짝 까다롭게 느껴질 수 있으나,
우리가 python 에서 2차원 배열에서 원소 하나를 끄집어낼 때 arr [i][j]를 쓰는 것처럼
numpy에서는 arr [i, j]를 사용합니다. (arr [i][j] 써도 되어요!)
여기서 우리가 구하고자 하는 것은 단지 "열" 이기 때문에 행을 ":"을 써서 공란으로 둔 채,
열의 index만 표시를 해주면 열만 꺼낼 수 있게 됩니다!
- Matrix에서 각각의 행들의 합, 열들의 합 구하기
합을 구하기 앞서, 파이썬의 axis라는 놈에 대해 짚어보고 넘어가자.
axis란 축을 말하는데, 주로 행렬을 쉽게 계산하기 위해 만들어졌다고 한다.
아래 사진을 보면서 같이 이해해보도록 하자.
세로(y축) 방향을 axis=0 가로(x축) 방향을 axis=1이라고 한다.
이 axis 개념은 numpy 뿐 아니라 pandas 등 파이썬의 라이브러리에서 쓰이니 참고하도록 하자.
암튼 우리는 일단 각 행, 열들의 합을 구해야 한다.
axis를 이용한 예제를 보도록 하자.
합을 나타내는 sum 함수를 쓰되, 인자로 axis를 넣어 어디 방향으로 더하는지 표시한다.
- Matrix에서 원소 하나 찾기
위에서 살짝 언급했는데, python의 2차원 배열에서 arr [i][j]를 쓰듯,
numpy는 arr [i, j] 또는 그대로 arr [i][j]를 사용한다.
- 행 단위 연산
보통 numpy에서 matrix 전체 원소에 대해 n을 곱하려면 간단하게
n * mat 연산을 실행해주면 된다.
그렇다면 행 한 줄만 곱하려면 어떻게 해야 할까?
이런 식으로 행을 따로 곱해주면 된다.
다음 시간에는 Matrix tranform에 대해 알아보자 안녕!~
'Artificial Intelligence' 카테고리의 다른 글
[numpy] 5주차 eigen vector, value (0) | 2020.04.15 |
---|---|
[numpy] 5주차 PIL로 image 읽고 변환하기 (0) | 2020.04.15 |
[numpy] 4주차 gram-schmidt, reflection matrix (2) | 2020.04.09 |
[numpy] 3주차 transform, determinant (0) | 2020.03.25 |
[numpy] 1주차 numpy 기초 함수 및 행렬 변환 정리 (1) | 2020.03.19 |