build my life

[Python] Numpy (1) 본문

Python

[Python] Numpy (1)

dalovee 2022. 8. 29. 17:51
728x90

Numpy

- 수치 계산을 하기 위한 파이썬 라이브러리

- 벡터와 행렬 단위의 대용량 수치 연산을 빠르게 진행하게 한다!

import numpy as np

numpy 배열 생성

np.array([1,2,3])

lst = [1,2,3]
np.array(lst)

+) 배열 만드는 것에는 여러 방법이 있다.

#range랑 같은 의미
np.arange(10)
# [0,1,2,3,4,5,6,7,8,9]

# n만큼 0으로 채운 배열 생성(n=5)
np.zeros(n)
# [0,0,0,0,0]

# n만큼 1로 채운 배열 생성(n=3)
np.ones(n)
# [1,1,1]

# np.full(shape, n)
# 지정 shape에 n을 채워 배열을 만든다.
np.full((2,3), 5)
# [[5,5,5],[5,5,5]]

배열 크기 확인

  • 1차원
arr = np.array([1,2,3,4,5])
arr.shape
# (5,)
  • 2차원
arr = np.array([[1,2],[3,4]])
arr.shape
# (2,2)
  • 3차원
arr = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
arr.shape
# (2,2,2)

numpy 배열도 슬라이싱/인덱싱 가능!

arr = np.array([[1,2],[3,4]])
arr.shape
# (2,2)

arr[:,1]
#array([2,4])

1차원 배열 슬라이싱은 쉽지만 2차원, 3차원.. 다차원으로 넘어갈 수록 헷갈린다..!!

 

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

 

 

✅ arr[ : , 0] vs arr[ : , :1]

arr[ : , 0]
# [1 4 7 10]

arr[ : , : 1]
"""
[[ 1]
 [ 4]
 [ 7]
 [10]]
"""

이 둘의 차이가 뭘까...................?

1)  없이 특정 인덱스값만 들어갔을 경우 0번째 인덱스에 있는 값들을 벡터형식으로 가져오고

2)  가 있을 경우엔 각 벡터마다 0번째 인덱스를 불러와 2차원 배열 형식 그대로 가져온다.

 

 

인덱싱 말고도 배열의 특정 부분을 가져오기 위한 방법이 있다.

마스킹(masking)

- bool 형식으로 데이터의 특정 부분을 선택한다.

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

mask = [True, False, False, True]
arr[mask]
#[[1,2,3],[10,11,12]]

True에 해당하는 행만 선택해 가져올 수 있다.

 

조건을 넣을 수도 있다.

mask = arr > 8
arr[mask]
# [9, 10, 11, 12]

모든 요소에 대해 마스킹을 할 경우엔 1차원 배열 형태로 가져옴!!!

 

여러개의 인덱스 값들을 이용해서 특정 부분을 선택해 가져올 수 있다.

index = [0,2] # 0번째와 2번째 행들만 가져오겠다.
arr[index]
# [[1,2,3],[7,8,9]]

Numpy 함수

배열 연산

  • 더하기
np.add(arr1,arr2)
  • 빼기
np.subtract(arr1,arr2)
  • 곱하기
np.multiply(arr1,arr2)
  • 나누기
np.divide(arr1,arr2)
  • 절대값
np.abs(arr1-arr2)

 

벡터 크기 측정 함수(Norm)

#L1 Norm
np.linalg.norm([1,2,3], 1)
# output : 6.0

#L2 Norm
np.linalg.norm([-1,2,3]) 
# output : 3.7416573867739413

 

내적(dot product) : 벡터 곱

v1 = np.array([3,2,2])
v2 = np.array([2,1,3])
np.dot(a,b)
# output : 14

=> 내적의 수치가 높을 수록 유사도가 높다라고 측정할 수 있다. 예를 들어 문서의 유사도를 측정한다고 할 때, 내적의 수치 혹은 벡터의 크기(norm)으로 나누어서 유사도를 측정한다.

v1 @ v2 # 표현식

행렬곱

2차원 공간에서 내적, 행렬끼리의 곱!

행렬곱 필수조건) N x M @ M x W = N x W

즉, 앞에 행렬의 열의 개수와 뒤의 행렬의 행의 개수가 동일해야한다!

x = np.array([
    [80,90,100],
    [85,75,92],
    [71,72,85],
    [86,89,95]
])

w = np.array([
    [0.4],
    [0.2],
    [0.3]
])

x @ w
# output : [80, 76.6, 68.3, 80.7]

차원 수가 늘어날 수록 머리가 터질 거 가탇....

728x90