[PYTHON] Numpy

유가연·2022년 2월 2일
0

TIL

목록 보기
11/32

Numerical Python. 대규모 다차원 배열을 다룰 수 있게 도와주는 라이브러리.

왜 필요한가? 데이터의 대부분은 차원이 다른 숫자 배열로 볼 수 있기 때문. 또한 머신러닝에서 대부분의 데이터는 행렬로 표현됨.

import numpy as np
np.array([1, 2, 3, 4, 5])

파이썬 리스트에는 int, float, str이 한 번에 들어갈 수 있다면 numpy에서는 불가능. 즉, 단일타입으로 구성해야한다는 소리. array.astype(자료형 타입) 으로 변경 가능.

다양한 배열(array) 만들기

np.zeros()

np.zeros(반복횟수, dtype = 자료형)array([0,0,반복횟수]) 로 반환됨. 이 때 반복횟수에 (튜플)을 넣게되면 행, 열의 개수로 반환됨.

np.arange()

np.arange(시작, 끝, 등차) 는 시작부터 등차만큼 증가하는 배열을 생성

np.linspace()

np.linspace(시작, 끝, 구간) 은 시작부터 끝을 구간만큼의 개수로 균등하게 나눈 값

np.random.random()

(튜플)에 따른 shape. 튜플에 해당하는 행, 열의 배열을 만들 수 있음. 튜플의 앞부분은 행의 개수, 뒷부분은 행의 길이

np.random.normal()

정규분포로 난수를 생성. 평균, 표준편차, (튜플)

np.random.randint()

시작부터 끝까지 튜플 형태로 출력해주세요

np.array - 배열생성
np.zeros - 0이 들어있는 배열 생성
np.ones - 1이 들어있는 배열 생성
np.empty - 초기화가 없는 값으로 배열을 반환
np.arange(n) - 배열 버전의 range 함수
np.random - 다양한 난수가 들어있는 배열 생성

배열

.ndim()

: 차원

.shape()

: 모양. 튜플로 반환

.size()

몇 개의 데이터가 있는지

인덱싱

슬라이싱

x[::2] 는 시작과 끝은 빈채로 2씩 건너뛰어서 값을 뽑아달라는 뜻.

reshape()

안에 튜플을 새로 넣어서 행과 열의 모양을 다시 바꿈.

concatenate()

np.concatenate([x, y]) 그러면 두 배열이 하나로 합쳐짐. axis = 0 은 아래 방향으로 붙음. axis = 1을 넣으면 가로 방향.

split(matrix, [3], axis = 0)

리스트는 어디 인덱스로 나눌 것인지. 지금 인덱스가 3이기 때문에 2 이전의 행렬들은 upper, 아래는 lower로 들어감.

기본연산

+, -, *, / 는 알아서 연산을 해줌. 이는 행렬간 연산도 가능하다.

브로드캐스팅

shape 다른 array끼리 연산. 모양이 달라도 잡아 늘려서 계산한다고 생각. 서로 shape를 맞춰줌.

집계함수

집계 : 데이터에 대한 요약 통계
x = np.arange(8).reshape((2,4))
np.sum(x), min,(x) max(x), mean(x) mp.std(x) : 표준편차
np.sum(x, axis = 0) 아래방향으로 값을 더해서 array를 만들어줌

마스킹연산

True, False array를 통해서 값들을 뽑아냄.


NUMPY : 파이썬에서 사용되는 과학컴퓨팅용 라이브러리. 비슷한 라이브로는 사이킷, 사이킷런등이 존재. 파이썬에서 기본으로 지원하지 않는 행렬같은 데이터구조 지원 및 수학/과학 계산 함수를 포함하고 있음.

머신러닝에서 대부분의 데이터는 행렬로 표현됨.

행렬 만들기

파이썬의 리스트의 리스트를 행렬로 표현하는 것과 같음. 리스트의 리스트 라는 것은 리스트 하나가 있고 이 리스트들이 행으로 이루어진 것들.

import numpy as np

A = np.array([[1, 2],[3,4]])
print(A)
""" 
[[1 2]
 [3 4]]
 """

## 행렬의 스칼라 곱
print(A * 3)
"""
[[3 6]
 [9 12]]
"""

## 행렬 덧셈
print(A + A)
"""
[[2 4]
 [6 8]]
"""

## 행렬 뺄셈
print(A - A)
"""
[[0 0]
 [0 0]]
"""

행렬 곱셈

x = np.array([[1, 2], [3, 4]])
y = np.array([3, 4], [5, 6]])

# 행렬 곱셈
print(np.dot(x, y))
"""
[[ 9  8]
 [21 20]]
"""

# 수학적으로는 정의되지 않은 연산
print(x * y)
"""
[[3 8]
 [9 8]]
"""

비교 연산

## 같은 차원에서 같다면 True, 다르면 False를 반환
print(a == b)
"""
[True, True, True, False]
"""

print(a > b)
"""
[True, False, False, False]
"""

논리 연산

a = np.array([1, 1, 0, 0], dtype = bool)
b = np.array([1, 0, 1, 0], dtype = bool)

np.logical_or(a, b)
"""
[Trye, True, True, False]
"""
np.logical_and(a, b)
"""
[True, False, False, False]
"""

Reduction

a = np.array([1, 2, 3, 4, 5])

np.sum(a)
# 15
a.sum()
# 15

a.min()
# 1
a.max()
# 5

## arg... 은 ...값의 인덱스를 반환
a.argmin()
# 0
a.argmax()
# 4

Logical Reductions

a = np.array([True, True, True])
b = np.array([True, True, False])

np.all(a)
# True
np.all(b)
# False

np.any(a)
# True
np.any(b)
# True

Statiscal Reductions

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

# 평균값
print(np.mean())
# 1.75

# 중앙값
print(np.median(x))
# 1.5

# 표준편차
print(np.std(x))
# 0.82915...

정규화(노말라이즈) 모든 합을 1로 만듦. 하는 이유. 확률을 구할 때 모든지 행렬을 행렬 전체의 값으로 나눠주기 위해서. 행렬 / np.sum(행렬) 이 최종 정규화 방법.

분산 : 값들이 서로 비슷한지, 커져있는지 확인하는 척도.

profile
유가연

0개의 댓글