Week1 - Day2 (Numpy)

jae oh·2021년 7월 14일
0

2021-summer-ai-bootcamp

목록 보기
3/8

아니 이게 변명이 아니라 병원만 다녀오면 체력이 부족해서 TIL 작성이 자꾸 늦어지자나...
난 numpy가 싫어

오늘 배운거
1. Numpy와 array
2. Numpy의 연산
3. Numpy와 선형대수

1. Numpy와 array, 기본 갖추기

기본적으로 python에는 list라는 것이 있다. 다른 언어들보다 활용하기좋아서 많이들 사용하지만 치명적인 단점인 '속도'가 있다. 그래서 이 점을 보완하려면 numpy 모듈의 array을 사용하면 좋다!

  • pip install numpy를 cli 환경에서 입력해서 numpy 모듈을 설치 완료 해줘야 사용 가능하다!
  • import numpy as np -> 여기서 as 뒤에 오는 단어는, 우리가 코드를 짤 때 계속 numpy...numpy를 하나하나 입력하기 귀찮으니 별칭을 만들어서 사용한다고 보면 된다!

Jupyter Notebook의 특수한 방식

  • 코드 앞에 %timeit을 사용하면 해당 코드가 어느정도의 시간을 사용하는 지 알 수 있다.

python list와 numpy array는 10^3 이상의 차이가 난다.

  1. numpy로 array 만들기
  • arr = np.array([])
    여기서 인자는 무조건 []형태로 넘겨주어야한다. 1차원, 2차원 등등 n차원으로 입력 가능하다.
  1. array.shape
  • array의 차원을 알 수 있다.
  • 만약 차원이 1차원 차원이라면 (n, )형식으로 나온다.
  • 차원이 2차원 이라면 (n,m)형식으로 출력된다. n*m matrix인 것을 알 수 있다.

2. Numpy로 연산하자

  1. VectorScalar의 연산
  • 벡터의 각 원소에 대해서 진행
x = np.array([1,3,5])
s = 9

print(x + s)
print(x - s)
print(x * s)
print(x / s)
  • 이런식으로 하면 결과값으로는 아래와 같이 나온다. 사칙연산처럼 사용하면 된다.

    [ 6 8 10]
    [-4 -2 0]
    [ 5 15 25]
    [0.2 0.6 1. ]

  1. VectorVector의 연산
  • 벡터의 같은 인덱스끼리 진행
y = np.array([1,2,3])
z = np.array([4,5,6])

print(x + s)
print(x - s)
print(x * s)
print(x / s)
  • scalar 연산할 때처럼 사칙연산을 이용하면 된다.

    [5 7 9]
    [-3 -3 -3]
    [ 4 10 18]
    [0.25 0.4 0.5 ]


3. Array Indexing & Slicing

이 방식은 기존의 pythonlist에서 인덱스를 사용해서 원소를 찾아내거나, slicing을 하는 방식과 거의 유사하다.

  1. Indexing
arr = np.array([1,2,3],[4,5,6],[7,8,9])
arr[1,2]
arr[1][2]

5
5

  • 위처럼 [n,m]의 형식이나 [n][m]의 형식을 사용하면 원하는 인덱스의 원소를 가져올 수 있다.
  1. Slicing
arr = np.array([1,2,3],[4,5,6],[7,8,9])
arr[0:2,1:3]
arr[0:2][1:3] --> 이 방식은 위의 방식과 결과가 다르다...! 위의 방식만 사용하는 걸로 하자

4. Array의 Broadcasting

같은 type의 data(array와 array끼리)에 대해서 연산이 가능하다.

x = np.array([0,1,0]) # 이럴 때, 전치를 하고 싶다면,
x = x[:, None]        # 이런 방법으로 전치해서 사용해준다.

나머지 연산은 앞에서 이야기한 것과 같다.


5. Numpy와 함께하는 선형대수!

[1] 행렬의 기본

영벡터
  • np.zeros(dim)을 사용한다. dim은 상수이거나 튜플의 형태이다.
  • 모든 원소가 0인 행렬
일행렬
  • np.ones(dim)을 사용한다. dim은 상수이거나 튜플의 형태이다.
  • 모든 원소가 1인 행렬
대각행렬
  • np.diag((main_diagonals))을 사용한다. main_diagonals은 상수이거나 튜플의 형태이다.
  • main_diagonals를 제외한 모든 원소의 값이 0인 행렬.
np.diag((1,2,3))

>> array([[1, 0, 0],
          [0, 2, 0],
          [0, 0, 3])
항등행렬
  • np.eye(n, (dtype=int, uint, float, complex, ...))를 사용한다. dtype의 디폴트는 float이며 n은 차원을 뜻한다.
  • main_diagonals가 1인 대각행렬이다.
행렬곱
  • @.dot()을 사용한다.
  • 행렬간의 곱 연산에 쓰인다.
a = np.array([[0,1],[2,3]])
b = np.array([[4,5],[6,7]])

print(a.dot(b))
print(a @ b)

[2] 조금 더 심화로!

trace
  • main_diagonals의 합을 구할때 사용한다.
  • .trace()로 구한다.
determinant(행렬식)
  • ad - bc
  • 행렬을 대표하는 값 중 하나
  • np.linalg.det()로 계산한다.
  • 만약 np.linalg.det()했을 때 값이 0이면, singaular matrix이다.
역행렬
  • np.linalg.inv()로 구할 수 있다.
고유값과 고유벡터(eigenvalue and eigenvector)
  • np.linalg.eig()으로 계산한다.

사실 고등학교 과정에서 행렬이 빠지면서 학교에서 선형대수 배울 때 조금 힘들었던 기억이 난다. 지금도 행렬을 다시 공부해야겠다는 생각이 들고 아직도 행렬 관련 연산이 바로바로 이뤄지지 않아서 부족함을 많이 느끼고 있당...

profile
여기저기 돌아다니는중

0개의 댓글