본문 바로가기
Study/머신러닝

[1] 머신러닝 - numpy 기초

by 투말치 2021. 5. 4.
반응형

머신러닝 분류

1. 지도학습

- 분류

- 회귀

- 추천 시스템

- 시각/음성 감지/인식

- 텍스트 분석(NLP)

 

2. 비지도학습

- 클러스터링

- 차원 축소

 

3. 강화학습

 

 

 

넘파이

넘파이의 기반 데이터 타입은 ndarray다.

ndarray로 다차원 배열을 생성할 수 있다.

 

 

#배열 생성
array1=np.array([1,2,3])

#배열의 형태 확인
print(array1.shape)

array1은 1차원이고 3개의 데이터를 가지기 때문에 

출력 결과물은 (3, ) 이다.

 

ndarray에 들어갈 수 있는 데이터 타입으로는 숫자, 문자열, bool 등 모두 가능하다.

ndarray 안에서는 연산을 위해서 같은 데이터 타입만 존재해야 한다.

 

그렇다면 ndarray를 만들 때 다른 타입의 데이터가 들어간 경우 어떻게 되는지 확인해보자.

list2=[1, 2, 'test']
array2=np.array(list2)
print(array2.dtype)

이 경우 int형의 데이터인 1과 2가 유니코드 문자열 값으로 변환한다.

따라서 출력 결과물은 <U11 이다.

 

 

nparray를 편하게 생성하는 방법

np.arange(10)   #0부터 9까지 nparray의 데이터로 만들어줌

np.zeros((3,2), dtype='int32') #(3,2)의 shape을 가지고 0으로 채원진 ndarray 생성

np.ones((3,2)) # (3,2)의 shape을 가지고 1로 채워진 ndarray 생성

- arange() : 연속적인 값으로 nparray 생성 가능

- zeros() : 0으로 초기화해서 nparray 생성 가능

- ones() : 1로 초기화해서 nparray 생성 가능

 

위 코드에서 zeros 함수를 사용할 때 데이터 타입을 지정했는데, 만약 데이터 타입을 지정하지 않았을 경우 디폴트 값은 float64다.

 

 

nparray의 차원과 크기 변경

array1=np.arange(10)

array2=array1.reshape(2,5)

reshape() 함수를 사용하면 ndarray의 차원과 크기를 변환할 수 있다.

array1은 1차원이고 데이터가 10개라서 2*5, 5*2 등으로 변환할 수 있다.

만약 10*3으로 변환하려고 하면 오류가 발생하고 변경이 불가능하다.

 

nparray를 효율적으로 사용하는 방법은 인자로 -1을 사용하는 것이다.

array1=np.arange(10)
array2=array1.reshape(-1, 5)
array3=array1.reshpae(5,-1)

print(array2.shape)
print(array3.shape)

 

첫 번째 출력 결과 : (2,5)

두 번째 출력 결과 : (5,2)

array2는 칼럼 인자인 5에 맞춰서 자동으로 변환하라는 뜻이고

array3은 로우 인자인 5에 맞춰서 자동으로 변환하라는 뜻이다.

 

 

넘파이에서 인덱싱하기

 

1차원 ndarray에서 데이터 추출하기

#단일 값 추출
array1=np.arange(10)

print(array1[2])

array1은 [0 1 2 3 4 5 6 7 8 9]이기 때문에 해당 값의 결과는 1이다. 

인덱스로 접근해서 데이터 수정도 가능하다.

 

그렇다면 1차원이 아닌 2차원의 ndarray에서 데이터를 추출해보자.

#앞에서 만든 array1을 변환해 array2를 만든다.
array2=array1.reshape(3,3)

print(array2[1,0])

해당 값의 결과는 3이다

  col 0 col 1 col 2
row 0 0 1 2
row 1 3 4 5
row 2 6 7 8

 

불린 인덱싱

 

조건 필터링과 검색에 사용할 수 있기 때문에 자주 사용되는 인덱싱이다.

 

array1=np.arange(10)

array2=array1[array1>5]
print(array2)
print(array1>5)

첫번째 출력 결과 : [6 7 8 9]

두번째 출력 결과 : [False, False, False, False, False, False, True, True, True, True]

 

행렬 정렬

np.sort()와 ndarray.sort()를 사용해서 행렬을 정렬할 수 있다.

array1=np.array([3,1,9,5])

sort_array1=np.sort(array1)
print(sort_array1)

출력 결과 : [1 3 5 9]

 

*np.sort()와 ndarray.sort()의 차이점

np.sort()는 원본 행렬은 변경하지 않고 정렬된 행렬을 반환한다.

ndarray.sort()는 원본 행렬 자체를 정렬한다.

두 함수 모두 디폴트가 오름차순이기 때문에 내림차순으로 정렬하고 싶으면[::-1]을 사용하면 된다.

sort_array1=np.sort(array1)[::-1]

 

행렬의 곱과 전치 행렬 구하기

 

두 행렬을 곱하려면 다음과 같이 왼쪽 행렬의 행과 오른쪽 행렬의 열이 같아야 한다.

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

#행렬 곱
dot_result=np.dot(A,B)

행렬 곱을 할 때는 dot() 함수를 사용한다.

 

 

*전치 행렬이란?

원래 행렬에서 행과 열 위치를 교환한 원소로 구성한 행렬을 말한다.

transpose()를 사용해서 전치 행렬을 구할 수 있다.

A=np.array([[1,2], [3,4]])
transpose_result=np.transpose(A)

 

 

 

 

 

 

참고자료 : 파이썬 머신러닝 완벽 가이드

 

 

반응형