[Machine Learning] 02 . Numpy Review

Jihyeon Park·2024년 9월 6일

Machine Learning

목록 보기
2/5
post-thumbnail

Numpy

  • 행렬이나 대규모의 배열을 쉬게 처리할 수 있도록 도와주는 파이썬(python) 라이브러리
  • 벡터, 행렬의 형태로 데이터 표현 및 연산
  • 딥러닝은 데이터 학습을 통하여 예측 가능 -> 학습을 위한 훈련 데이터는 2, 3차원 행렬의 형태를 가짐
  • 열 : 하나의 특징(속성)
  • 행 : 하나의 훈련 데이터
  • numpy 다차원 배열 데이터 구조 : ndarray(n-dimensional array)
  • numpy를 이용하여 행렬을 통한 데이터 접근 및 연산 가능

array 생성

  • 배열 생성 시 기본 자료형은 numpy.float64
  • 명시적으로 numpy.int32, numpy.unicode 등 직접 지정 후 생성 가능

생성 방법

배열 객체 = numpy.array([])
'''
- .arry : 생성자 함수
- ([]) : 파이썬 리스트
'''

배열 객체 = numpy.arange(시작값, 종료값, 간격)
'''
시작값 ~ 종료값-1
'''
# 1차원 벡터
numpy.array([n1, n2,...])

# 2차원 행렬
numpy.array([[n1, n2], [n3, n4],...])

# 지정된 개수만큼 0을 채운 행렬 생성
배열 객체 = numpy.zeros((행의 개수, 열의 개수))

# 지정된 개수만큼 1을 채운 행렬 생성
배열 객체 = numpy.ones((행의 개수, 열의 개수))

# 0행 0열부터 시작하여 대각선으로 n개 만큼 1, 나머지는 0을 채운 행렬 생성
배열 객체 = numpy.eye(n)

# 시작값 ~ 종료값의 수들이 n개 균일하게 생성
배열 객체 = numpy.linespace(시작값, 종료값, 개수)

array 다루기

# 배열 정렬
numpy.sort(행렬)

# 배열 합치기
numpy.concatenate((행렬1, 행렬2,...), axis=0 또는 1)
'''
axis = 0 -> 세로 합치기, 합쳐지는 행렬들의 열의 개수 일치
axis = 1 -> 가로 합치기, 합쳐지는 행렬들의 행읙 개수 일치
'''
  • 형상 확인 : .shape
  • 차원 확인 : .ndim
  • 형상 변환 : .reshape(행, 열)
    -> 주의 사항 : 변경 전 행 열의 개수 == 변경 후 행 열의 개수
    -> 예시 : 3행 1열의 numpy 데이터를 1행 3열로 변환 등 행과 열 변환

행렬 곱

  • 주의 : 앞 행렬의 행의 개수 == 연산되는 행렬의 열의 개수
  • Machine Learning 이미지 프로세싱에서 많이 사용
# 연산식
numpy.dot(행렬1, 행렬2)
numpy.matmul(행렬1, 행렬2)
  • 기본적으로 행렬곱은 2개의 행렬에 대한 연산을 함

  • 3개 이상의 행렬에 대한 곲을 하려면 여러 개의 행렬곱 함수 사용

  • 1차원 벡터들만 포함된 행렬곱 : 벡터 원소간 내적의 합 구함

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

  • 행렬 x 스칼라(단일값의 행렬곱 : 행렬의 각 원소에 대하여 단순 스칼라를 곱한 합 구함
a = np.array([1, 2, 3])
b = 2
np.dot(a, b) # [2, 4, 6]
  • 행렬1 x 행렬2 : 행렬1의 열의수 == 행렬2의 행의 수인 경우만 행렬곱 가능

  • 행렬 x 벡터 : 행렬의 각 행과 벡터 원소간 내적의 합 구함

a = np.array([[1, 3], [2, 4]]) # 2 * 2
b = np.array([2, 5]) # 벡터
np.dot(a, b) # [17, 24]

  • 벡터 x 행렬 : 행렬간 행렬곱 구하는 방식과 같은
a = np.array([[1, 3], [2, 4]]) # 2 * 2
b = np.array([2, 5]) # 1 * 2
np.dot(b, a) # [12, 26]



브로드 캐스팅 연산

  • 행렬 간 연산 시 연산할 데이터의 수가 부족할 경우 : 브로드 캐스팅을 통하여 데이터를 행 단위로 반복하여 노출 후 연산
i = np.array([[1, 2], [3, 4]])
j = np.array([[1, 2]])

print(i)
print(j)
print(i + j)

전치행렬

  • 원본 행렬의 행과 열을 전치 (3 * 2 -> 2 * 3)
  • 형식 : 행렬이름.T

1, 2, 3
3, 4, 5
⬇️ 전치 행렬
1, 3
2, 4
3, 5

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

iterator

  • nditer() : 행렬의 모든 원소 방문하기 위하여 사용
  • 결과는 읽어들인 원소들의 첫 번째 값
  • while문을 이용하여 첫 번째 원소의 값부터 하나씩 접근 가능
  • 행 우선으로 원소의 값 접근
  • iternext()를 통해 원소의 처음부터 끝까지 순차적으로 읽음
numpy.nditer(행렬, flags=[옵션], op_flags=[옵션])

'''
flags = ['multi_index'] : array요소의 인덱스 값 구함
op_flags = ['readwrite'] : 읽기, 쓰기 모두 가능한 상태
'''

파일 데이터 읽기

numpy.loadtxt('파일명', delimiter = '분리자')

기타 함수

  • .random.rand(n)
    -> 0 ~ 1의 소수 n개 생성
  • .random.rand(a, b)
    -> 0 ~ 1의 소수를 a행 b열의 크기로 생성
  • .exp(행렬)
  • .log(행렬)
  • argmax or .argmin(행렬, axis=0 or 1)
    -> 행렬의열또는행단위최대값의인덱스리턴
    -> axis=0:열기준
    -> axis=1:행기준

solve

1

a = np.array([10, 20, 30, 40, 50, 60]).reshape(3, 2)
a[0:-1, 1:2] 

2

a = np.array([1, 2, 3])
a.shape # (3,) : 3개의 요소를 가진 1차원 배열
a = np.array([[1, 2, 3], [4, 5, 6]])
a.shape # (2, 3) 2행, 3열
a = np.array([[1, 2, 3, 4, 5], [1, 2, 3, 4,5]])
a.shape # (2, 5) 2행, 5열

3

i=np.array([[1,2,3],[3,4,5]]) 
j=np.array([[1,2],[3,4],[5,6]]) 
c=np.dot(i,j)
print(c)


4

a = np.arange(10).reshape(2, 5)
for i in np.nditer(a,
                   flags=['multi_index'], op_flags=['readwrite']):
    i = i ** 2
    print(i)

np.diter()
Numpy 배열을 반복(iterate)할 때 사용

flags = ['mylti_index']

  • 현재 위치에 대한 다차원 인덱스 제공
  • 예시 : 2D 배열에서 현재 탐색 중인 요소가 배열의 몇 번째 행과 열에 있는 인덱스 알려줌

op_flags=['readwrite']

  • 기본적으로 np.nditer는 배열의 요소를 읽기 전용(read-only)로 순회
  • op_flags='readwrite']는 배열 요소를 수정할 수 있는 모드로 순회 가능
    -> 순회하면서 배열 요소의 값을 읽을 뿐만 아니라 변경할 수도 있음
profile
Studying data analysis and data science!

0개의 댓글