boostcamp AITech

[6일차] numpy

라이크나우 2021. 1. 26. 03:05

numpy 대충대충 쓰기만 했지 이렇게 자세히 배울 기회가 있어서 다행이답

 

  • 고성능의 과학 계산용 패키지이다
  • 일반 list에 비해 빠르고, 메모리 효율적이다
  • 반복문 없이 데이터 배열에 대한 처리를 지원한다!!
  • 선형대수와 관련된 다양한 기능도 지원한다~
  • import numpy as np로 불러오면 됨!

만들기

np.array([리스트블라블라], 타입)

이렇게 적어주면 된다. 

test = np.array([1, 2, 3, 4], float)

👆이런식으로!

 

float로 타입을 정해준 것만 봐도 알겠지만, 동적 타이핑을 지원하지 않는다. 오로지 하나의 data type만 넣을 수 있다는 점!

 

저 리스트 안에 string으로 숫자가 들어와있든지, int로 들어와있든지 상관하지 않고 float형으로 통일시켜준다.

기존 파이썬의 리스트는 사실 주소값을 가리키고 그 주소값이 값을 가리키는 구조라서 주소가 여기저기 흩어져있던 반면

numpy의 array는 메모리에 따닥따닥 붙어있어서 연산이 빠르게 가능하다!

 

test.dtype

test.shape

👆를 하면 데이터타입과 모양을 찍어준다.

위의 예시를 보면 데이터 타입은 float64, shape는 (4,) 이겠지

 

아 참고로, 여기서 차원은 rank라고 이름지었다.

shape는 위와 같다. 2차원일땐 앞에 4를 똑 떼면 된다.

 

밑에는 앞으로 다룰 함수들인데..... 정리해놓으니까 정말 많다. 하지만 코드를 쓱 보면서 할 것 이기 때문에 금방 끝날거다!

  • handling shape
    • reshape
    • flatten
  • indexing & slicing
  • creation function
    • arange
    • ones,zeros and empty
    • ones_like, zeros_like and empty_like
    • identity
    • eye
    • diag
    • random sampling
  • operation functions
    • sum
    • axis
    • mean & std
    • concatencate
  • array operations
    • 기본 계산들
    • dot product
    • transpose
    • broadcasting
  • comparisons
    • all & any
    • whear
    • argmax & argmin
  • boolean & fancy index

한번 시작해보자!

 

handling shape

먼저 reshape다

👆행렬의 모양을 바꿘준다. 당연히 shpae의 요소를 다 곱한 값은 같아야한다!

만일 자신이 없다면 -1을 적어서 알아서 파이썬이 계산하도록 해도 좋다.

 

flatten

👆flatten은 이런 3차원 배열도 펼쳐준다.

 

👆reshape(16,)으로 해준 값과 똑같은건 당연쓰!

 

indexing & slicing

python list의 인덱싱 슬라이싱과 동일하다. 동일한 부분은 언급만 하고 다른 부분만 조금 살펴보자

👆2차원 배열 계산한다고 [n, n]으로 쓰고 컴파일 에러를 맞이해본 사람이 나뿐이 아니었나보다. 하하 다행히 넘파이에서는 지원해준다. 나같은 사람 많았나봐~~^^ 아 참고로 앞은 row 뒤는 column이다!

 

 

👆이런 식의 부분 slicing도 가능하다는 점~

 

creation function

숫자 몇개만 뚝딱여도 넘파이 배열 하나 완성해주는 매직 ~

 

👆for문 돌릴 때 range()에서 넣는 그 range다

a만 붙혀주면 어레이 하나 뚝딱해준다. 놀랍게 소수 step도 가능하다! 늘어져 있으니 reshape로 원하는 모양 잡아주면 되겠지~

 

👆이렇게 zero와 one으로 초기화된 배열을 내뿜어준다.

 

empty같은 경우는 메모리만 잡아주고 값은 안넣어줘서 쓰레기값이 들어가있기도하다.

 

👆어쩌구 like들은 명령받은 행렬과 같은 크기의 행렬에 one zero 아니면 empty형태로 반환해준다.

 

👆단위행렬(항등행렬)을 생성한다.

 

👆행과 열의 갯수가 같지 않을 때도 단위행렬 비슷하게 만들어준다

 k로 위치도 정할 수 있다. 왜 eye일까 고양이 눈처럼 선 하나 있어서 그런가?ㅎㅎ

 

👆diag는 대각선을 추출해준다. 역시 k로 위치를 지정할 수 있다.

 

 

👆uniform은 0에서 1사이에서 균등한 배율로 10개의 숫자를 랜덤으로 뽑아달라는거다.

normal은 평균이 0이고 표준편차가 1인 정규분포를 기준으로 10개의 숫자를 랜덤을 뽑는거다!

 

operation functions

sum은 동일하니 패스하고

 

여기선 축 이야기를 좀 하고 넘어가야한다. 

👆이걸 보면 차이를 단번에 알 수 있다. axis=1는 가로로 더해주고  axis=0은 세로로 더해준다.

다시 한번 정리하자면

빨간 방향은 axis=0

노란 방향은 axis=1을 의미한다!

 

아 헷갈려~~~ 그러니까 행이 기준이잖아? [3,4]를 할때도 3이 행이듯이? axis=0 일 땐 행을 기준으로 쑥 압축해버리는거다. 그러면 세로로 더해지겠지! 난 진짜 행렬이 너무 헷갈려 이렇게 외우자~~

 

근데 여기서 더 환장포인트는 삼차원 배열이되면 

하나씩 뒤로 밀린다는 점 ^^

 

하튼 이걸 갑자기 왜했냐면,

 

mean 또는 std를 구할 때 기준 축을 적어줘야하기 때문이다.

 

👆 일단 아무것도 안적어주면 모든 요소의 평균을 구해주고

axis=0일 땐 세로의 평균/ axis=1일 땐 가로의 평균을 구해준다!

 

그 외 연산들 std exp 뭐 이런것들도 있다~

 

concatenate

vstack은 수직적으로 즉 행렬을 더 쌓아준다. 그럼 행을 하나 추가해준단 의미겠지? 그래서 위와 같은 결과가 나온다.

hstack은 옆으로 늘려준다.

 

👆그럼 이 결과도 이해가 될거다!

 

👆vstack은 concatenate로 쓸 땐 axis=0으로 조건을 걸어주고

hstack은 axis=1로 걸어주면 똑같은 결과를 맞이할 수 있다!

 

👆만일 세번째 줄이 없다면 오류가 날 것이다!

하지만 차원을 늘려주었기 때문에 문제가 안났다.

차근차근 살펴보자

b=b[np.newaxis, :]로 인해서 array([[5, 6]]) <- 이렇게 행이 추가 되었다.

그 상태로 전치행렬을 하니 array([[5], [6]]) <- 이렇게 되었고 이제 concatenate 연산을 할 수 있게 된거다!

 

만일 b=b[:,np.newaxis] 라면 열이 추가 된거라 array([[5], [6]]) <- 이렇게 되어서 전치행렬 없이도 concat 연산이 가능하다!

 

array operations

기본적인 사칙연산이야 뭐 앞에 글에서도 다뤘듯이 더하기 빼기 성분곱 다 지원한다

물론 기존 행렬의 곱셈인 dot도 지원하는데 x@y 이렇게 해도 되고 x.dot(y) 이렇게 해도 된다

전치행렬은 x.transpost() 혹은 x.T 이렇게!

 

broadcasting

말그대로 퍼져나가는 계산이다.

3이 모든 곳에 퍼쳐나간게 보이나용

 

이 연산은 먹힐까 안먹힐까? (4,) (1,3)의 곱셈이 과연,,

당근 먹힌다 .

이렇게 퍼져나가면서 계산이 되게 때문이당~

 

comparisons

이렇게 숫자를 비교해버리면 boolean list를 반환한다. 

 

여기서 이렇게 a>5인게 하나라도 있으면? <0인게 하나라도 있으면? 이런식으로 any 와 all 을 사용할 수 있따.

 

where는 true인 인덱스를 반환해준다!

 

이건 논리 or and를 어레이간에 처리할 수 있는건데 보면 그냥 알 수 있다

 

이건 좀 신기하다 argsort()인데

sort 한 결과 값은 [1, 2, 3, 4, 5, 8, 23, 78]일테니 저 값들이 있는 인덱스를 반환해준다!

거꾸로 할거면 a.asgsort()[::-1] 라고 해주면 된다!

 

argmax argmin은 최대 최소값이 있는 인덱스를 반환한다

axis로 축을 정해주면 축에 맞춰서 해준다규

 

boolean & fancy index

boolean list는 앞에서 다뤘고, 컨디션을 넣어주면 해당하는 값만 꺼내주는 걸 알 수 있다.

하하 정말 팬시하다~~

b list에 인덱스를 넣어주면 해당하는 값을 take 해준다!

 

[b,c]에 해당하는 값을 반환한다.

[0,0], [0,1], [1,1], [1,1], [0,1] 순이겠지~

 

data io는 저번에 다뤘으니 생략~!

 

 

와 나 진짜 열두시부터 단 10분도 안쉬고 달렸는데 네시다 ^^ 이따가 아침에도 힘내자악