티스토리 뷰

Code/Python

4. 넘파이(numpy) 기초 사용법

행복한 꿈나무 2021. 7. 2. 15:17
반응형

 

넘파이 사용 방법의 마지막인 4장에서는 넘파이의 ndarray를 쉽게 생성하고, 차원과 크기를 변경을 하여 원하는 형태로 바꾸는 방법과, 정렬을 통해서 내용을 정리하는것 그리고 연산을 하여 데이터의 값을 다루는 내용에 대해서 다뤄보도록 하겠습니다.
처음에는 ndarray를 쉽게 생성하는 함수에 대해서 설명을 드릴 예정입니다. 앞서 3장에서 차원을 만들때 다뤄는 봤으나 좀더 자세히 설명을 드리겠습니다.

1. ndarray 편리하게 생성하는 방법

간혹 ndarray를 생성을 할 때, 특정 값이나 0또는 1로 초기화를 하여 쉽게 생성을 해야될 필요가 있는 경우가 있습니다. 이때 arange, zeroes, ones등과 같은 것을 사용하여 편하게 배열 생성이 가능합니다.

  • arange()

일반적으로는 테스트용으로 데이터를 생성을 하거나 일괄적으로 대규모 데이터를 초기화해야 할 경우 사용을 합니다. 3장에서도 테스트용으로 arange를 사용을 했었습니다.
arange() 함수는 파이썬 표준 함수인 range()와 유사한 기능입니다. array + ragne()로 표현을 할것으로 arange(숫자)로 사용을 하며 0부터 숫자-1 까지의 값을 순차적으로 ndarray의 데이터값으로 변환해 줍니다.
np.arange(10)으로 할 경우, 시작값인 0부터 10의 -1인 9까지의 순차적인 숫자로 차원을 생성해줍니다.

그렇게 [0~9]까지의 1차원 배열을 쉽게 만들 수 있습니다.

시작값이 0이 아닌 다른 숫자로도 시작을 할 수도 있습니다.
arange(원하는 시작 숫자, 종료 숫자)를 기입을 하면 아래와 같이 생성이 되며, 시작하는 숫자부터 종료 숫자까지의 수만을 이용하여 생성이 됩니다.
np.arange(5,10)으로 하게 되면, 시작값이 5부터 10-1 까지의 숫자까지 자동으로 생성을 하여, [5~9] 까지의 차원이 생성이 됩니다.

  • zeros()

계속 해서 zeros 함수에 대해서 설명을 드리겠습니다.

zeros 함수의 경우 튜플 형태()의 shape 값을 입력하면 모든 값을 0으로 채운 후 입력한 튜플형태의 shape의 값으로 ndarray를 반환을 합니다. 반대로 ones 함수의 경우 모든 값을 1로 채운 후 반환하게 됩니다.
아래 예제와 같이 np.zeros((3(row),2(col)), dtype='int32(type)')을 입력을 하면 0으로 이루어진 3x2의 행렬이 생성이 됩니다.

  • ones()

동일하게 ones 함수를 만들어 보겠습니다. 행과 열은 동일하고 함수값만 변경을 하였습니다.
1로된 3x2의 행렬이 생성이 되었습니다.

그러나 결과를 보면 ones의 dtype이 float64로 기존에 int32와 차이가 있습니다. 왜 차이가 있을까요?
zeros, ones의 경우 dtype을 기입을 하지 않으면 기본값인 float64로 반영이 됩니다.
그러므로 다른 type을 원하시면 원하는 type을 기입을 해주시기 바랍니다.

 

2. ndarray 차원과 크기 변경

이미 생성한 배열에 대해서 행,열 값을 반대로 하고자 할 때, 유용하게 사용이 가능한 ndarray 차원과 크기를 변경이 가능한 reshape()에 대해서 설명을 드리겠습니다.

  • reshape()

먼저 arange(10)을 사용하여 1차원 배열을 생성을 합니다. 그리고 reshape(row,col) 값을 입력을 합니다.
reshape_array1, 2는 row와 col값을 서로 다르게 한 뒤, 결과를 보면 1차원 배열이 2차원 배열로 변경이 되었으며, 각각 입력한 row와 col 값으로 변경된 것을 확인 할 수 있습니다.

다만, reshape의 경우 지정된 사이즈로 변경이 불가능 할 경우엔 오류가 발생이 됩니다. 예를 들어 reshape(4,3)의 경우엔 에러가 발생이 됩니다.
단순히 reshape는 원하는 row, col 값으로 변경을 하기위해서 사용하지는 않습니다. 더욱 효율적으로 사용하기 위해서는 값을 -1 로 적용을 하였을 경우입니다.

아래 예제를 통해서 좀 더 쉽게 설명을 드리겠습니다. 1차원의 0~9까지의 데이터를 가지고 있는 배열이 있습니다.
reshape(-1,5)라고 정의한다면 고정된 col 값 5를 기준으로 10개의 데이터를 자동으로 row를 새롭게 생성을 하여 배열을 만듭니다. 그렇게 만들어진 배열을 확인해 보면 (2,5)의 배열로 재 생성이 되었습니다.
reshape(-1,2)라고 정의한 함수는 고정된 col 값 2개를 기준으로 row를 재생성 하여 (5,2)의 배열로 생성을 한것입니다.

해당 함수는 reshape(-1,1)와 같은 형태로 자주 사용됩니다. reshape(-1,1)로 여러개의 row값과 반드시 1개의 col값을 가진 ndarray로 변환을 하고, 다른 ndarray를 결합하고 각각의 형태를 통일을 할 때 많이 사용을 합니다. 3차원을 2차원으로, 1차원을 2차원으로 변경도 가능합니다.

아래 예제를 통해서 알아보겠습니다. tolist()는 가독성을 위해서 사용을 했으며, 데이터를 리스트로 변환을 해줍니다. 3차원으로 만든 array_3d를 reshape(-1,1)을 사용을 하여 2차원으로 변환을 하였고, 반대로 1차원에서 2차원으로 변경을 하였습니다.

3. numpy 행렬의 정렬

numpy의 함수 중 np.sort(), ndarray.sort()를 사용해서 정렬하는 방법과, argsort()를 사용하여 정렬된 행렬의 인덱스를 반환하는 방법에 대해서 가이드를 드리겠습니다.

  • 행렬 정렬의 sort()

먼저 행렬 정렬에 대해서 설명을 드리겠습니다.

np.sort()와 ndarrary.sort()의 차이는 numpy에서 sort()를 호출하는 방식과, 행렬에서 sort()를 호출을 하는 방식의 차이가 있습니다. 정렬은 하는 목적은 둘다 동일하지만, np.sort()의 경우엔 원 행렬은 유지한 채 정렬된 행렬을 반환하지만, ndarray.sort()의 경우엔 원 행렬 자체를 정렬한 형태로 변환하고 반환 값은 None입니다.

예제를 보면서 자세하게 설명하겠습니다. np.sort()의 경우엔 원본 행렬에 작업없이 진행을 하지만, ndarray.sort()의 경우엔 원본 행렬을 수정을 하였으며, 반환은 None으로 하였습니다.

두개의 함수모두 정렬은 오름차순을 기준으로 정렬을 합니다. 내림차순으로 정렬을 하고자 한다면 [::-1]을 적용하면 됩니다.

행렬이 2차원 이상의 경우엔 row, col 방향으로 정렬을 수행 할 수 있습니다.

 

  • 인덱스 정렬의 argsort()

계속 해서 정렬된 행렬을 인덱스로 변환해주는 argsort()에 대해서 설명 드리겠습니다.

행렬이 정렬되어있어도 인덱스 [0], [1] 과 같이 특정 위치에있는 값을 추출을 할때 사용하는 인덱스는 변하지 않습니다. 예로 [3,1,9,6] 의 행렬이 있으면 3부터 인덱스는 [0], 1은 두번째이므로 인덱슨는 [1]을 가지게됩니다.

해당 argsort()를 사용하면 정렬 시 인덱스의 값을 반환하게 됩니다.
예제로 좀더 쉽게 설명을 드리겠습니다. [3,1,9,6]의 값들은 순서대로 0, 1, 2, 3으로 인덱스를 할당을 받습니다. 행렬을 정렬을 하면 [1,3,6,9]로 바뀌고, 이때 인덱스 값은 [1 0 3 2]로 바뀌게 됩니다.

행렬을 정렬 후 인덱스를 찾는게 아닌 argsort()를 사용하면 인덱스의 값을 바로 확인이 가능합니다.

인덱스 정렬은 numpy에서 많이 사용을 할 수 있습니다. DB의 데이터나, Pandas의 dataframe에 있는 칼럼과 같은 메타 데이터를 가질 수가 없습니다. 그래서 값과 메타데이터는 별도의 ndarray로 각각 가져가야만 합니다.

예를 들어서 국어=98점, 영어=96, 수학=81, 사회=75, 과학=87점 이란 데이터를 ndarray로 활용을 해보도록 하겠습니다. subject_array = ['국어', '영어', '수학', '사회', '과학'] 과 score_array = [98, 96, 81, 75, 87]로 2개의 ndarray로 만들어야 합니다. 이때 성적순으로 학생이름을 출력을 하고자 한다면, 순서는 국어 > 영어 > 과학 > 수학 > 사회 순으로 되어야 합니다.

단 과목 행렬과 점수 행렬을 각각 오름차순으로 정리하면 결과가 달라지므로, 이럴때 argsort()를 사용하면 쉽습니다.

예제를 보면서 설명을 하겠습니다. ndarray를 각각 생성을 먼저 합니다. 이후 argsort()를 점수 행렬을 기입 하여 인덱스 정렬을 합니다. 해당 가이드에서는 성적 순으로 표기를 하기위해서 내림차순으로 적용을 하였습니다.
내림차순으로 인덱스 정렬을 하였으 경우, 높은 과목인 국어의 인덱스 부터 정렬이 되어 [0 1 4 2 3] 의 결과값을 받습니다.
이후 과목 이름을 출력받기 위해서 인덱스를 사용 한 검색을 하기 위해서 subject_array[인덱스 array]를 기입을 하게 되면, 내림차순으로 과목 이름이 출력이 됩니다.

4. numpy 연산

numpy 연산에는 행렬 내적(곱)과 전치 행렬등 많은 선형대수 연산을 지원하고 있습니다. 저는 가장 많이 사용하는 행렬 내적과 전치 행렬에 대해서 설명 드리겠습니다.

  • 행렬 내적(행렬 곱)의 dot()

행렬 내적은 행렬 곱으로 두개의 행렬 A와 B의 내적은 np.dot()을 이용해서 쉽게 결과를 받을 수 있습니다.

a는 [[1,2,3][4,5,6]]이라는 2_2의 2차 행렬이, b는 [[7,8][9,10][11,12]]라는 2_3의 2차 행렬이며 np.dot(a,b)를 하면 1_7+2_8+3_9 와 같이 행렬 내적을 하여 결과 값인 [[58,64][139,154]]인 2_2의 행렬로 결과 값을 받을 수 있습니다.

  • 전치 행렬의 transpose()

마지막으로 전치 행렬에 대해서 설명을 드리겠습니다. 전치 행렬은 transpose()를 사용을 합니다.
전치 행렬은 기존 행렬의 행과 열의 위치를 바꾸는 것을 말합니다. 예를 들어 a = (2,3)의 행렬을 전치하면 (3,2)로된 행렬로 변경이 됩니다.

아래 예제를 보면 (2,3)의 행렬로 되어있는 a 행렬을 전치를 하게 되면, (3,2)의 행렬로 전치가 된 것을 확인 할 수있습니다. 전치 함수인 transpose()를 사용하면 쉽게 전치가 되는것을 확인 할 수 있습니다.

 

지금까지 numpy의 설치부터 사용하는 방법에 대해서 대략적으로 소개는 드렸으나, 이외의 함수나 다양한 기능들이 많지만 numpy 시작하는 입장에서는 많이 어려운것같습니다. 다음엔 numpy와 같이 많이 사용하는 pandas에 대해서 설명으로 돌아오겠습니다.

긴글 읽어주셔서 감사합니다!!

반응형

'Code > Python' 카테고리의 다른 글

3. 넘파이(numpy) ndarray 다루기  (0) 2021.06.24
2. 넘파이(numpy) 기초 사용법  (0) 2021.06.17
1. Numpy를 위한 Anaconda설치 in Mac  (0) 2021.06.17
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday