2일차) 넘파이 (2) - 上

BinBin·2022년 1월 1일
1

머신러닝 공부

목록 보기
3/10
post-thumbnail

저번 포스팅에서는 넘파이에 대한 대략적인 설명과 ndarray 데이터 타입에 대해
공부했습니다.

이번 포스팅에는 넘파이의 변수와 함수에 대해 알아보겠습니다.

ndarray의 모양을 알아내는 변수 'shape' 🧐

공식 레퍼런스 링크<<꼭 읽어보세요!

문서를 읽어보셨다면 이해하기가 쉬울 것 입니다.
항상 프로그래밍 언어를 공부할 때 공식 문서를 읽어본다면 공부하는데 큰 도움이 될 수 있고 이후에도 업데이트를 하거나 기억이 나지 않는 부분이 있을 때 참고하면 좋습니다.

shape 변수는 단어 그대로 배열의 모양을 정수로 이루어진 튜플 값을 반환해주는 기능을 수행합니다.

그 예시를 보여주자면

import numpy as np

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

array_dim_2 = np.array([[1, 2, 3], 
                        [4, 5, 6]])
                        
array_dim_3 = np.array([[[1, 2], [3, 4]], 
                        [[5, 6], [7, 8]]])
                        
print(array_dim_1.shape)
print(array_dim_2.shape)
print(array_dim_3.shape)

이런 식으로 코드를 작성해서 결과값을 보면

(6,)
(2, 3)   
(2, 2, 2)

이렇게 위에서 설명한 것과 같이 int값으로 된 튜플을 반환합니다.
괄호 안의 값을 (a, b)로 한다면
a와 b는 각각 행과 열을 나타냅니다.

다만 맨 위의 값과 같이 콤마 다음에 아무런 값이 없다는 것은 그냥 1차원으로
구성이 된 배열이라 행과 열이라고는 할 수 없습니다.

따라서 array_dim_1은 6개의 데이터만을 가진 1차원 배열이고, array_dim_2는 2개의 행과 3개의 열로 된 2차원 배열, 그리고 마지막으로 array_dim_3은 일반적인 평면으로는 나타낼 수 없고 3차원, 즉 말 그대로 면과 면이 모인 것이기 때문에 (2, 2, 2)은 2 x 2로 된 블록 모양의 데이터 2개가 앞 뒤로 붙은 형태입니다.

이제부터는 shape 변수를 통해 방대한 양의 데이터도 어떤 형태로 구성이 됐는지 알아볼 수 있습니다.

ndarray의 차원을 알아내는 변수 'ndim' 🧐

이 변수는 데이터의 차원을 알 수 있는 간단한 기능을 합니다.

import numpy as np

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

array_dim_2 = np.array([[1, 2, 3], 
                        [4, 5, 6]])
                        
array_dim_3 = np.array([[[1, 2], [3, 4]], 
                        [[5, 6], [7, 8]]])
                        
print(array_dim_1.ndim)
print(array_dim_2.ndim)
print(array_dim_3.ndim)

아까와 똑같은 변수를 설정해놓고 ndim 변수로 차원을 알아보면 결과값으로

1
2
3

이렇게 각 변수의 차원을 반환해줍니다.

사실 그냥 대괄호가 몇 개인지만 세봐도 몇 차원인지는 알 수 있지만
이제부터는 ndim을 사용해 더 있어보이게 차원을 알아봅시다.

ndarray의 차원과 크기를 바꾸는 reshape( ) 🧐

reshape는 아주 자주 사용이 되는 것이므로 필히 숙지를 해놓아야 합니다.

이 메서드는 ndarray를 원하는 차원과 크기로 변환을 할 수 있는 기능을 하는데
예시를 보여주자면

import numpy as np

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

print(array_dim_1)

array_dim_2 = array_dim_1.reshape(2, 3)

print(array_dim_2)
print(array_dim_2.shape)
print(array_dim_2.ndim)

위 코드를 실행하면 다음과 같은 결과값이 반환됩니다.

[1 2 3 4 5 6]

[[1 2 3]
 [4 5 6]]
 
(2, 3)

2

원래 1차원으로 생성한 array_dim_1을 reshape로 이용해 2 x 3의 2차원 형태로 바꾸었습니다.

여기서 중요한 점은 총 데이터의 개수가 6개이므로 이를 벗어난 3 x 4같은 형태로 바꿀시에는 에러가 나니 그 점에 유의하시기 바랍니다.

그런데 만약에 고차원이면서 방대한 양의 데이터를 다루고 있을 때는 명확하게
reshape의 값을 정하기가 어려울 때도 있습니다.

이러한 점을 넘파이를 개발한 사람들도 알고 있었는지 이를 도와주는 방법도 마련했는데
그 방법은 바로 '-1'을 이용하는 것 입니다.

백문이 불여일견이라고 직접 예시를 보여드리겠습니다.

import numpy as np

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

print(array_dim_1)

array_dim_2 = array_dim_1.reshape(-1, 3)

print(array_dim_2)
print(array_dim_2.shape)
print(array_dim_2.ndim)

이렇게 -1을 넣어주면 값이

[1 2 3 4 5 6]

[[1 2 3]
 [4 5 6]]
 
(2, 3)

2

짜잔~ 똑같이 나왔습니다!

-1을 넣어주게 되면 X * 3의 형태에서 데이터 값에 맞는 X의 값을 자동적으로 계산해서
산출을 해주게 됩니다. 따라서 본인이 2차원으로 표현하고 싶을 때 원하는 열만큼 미리
설정해 놓고 -1을 행의 값으로 넣어주면 그에 맞춰서 행의 값이 정해집니다.

역시나 데이터 값을 벗어나게 되면 에러가 나게 되므로 주의해주시기 바랍니다.

profile
빅데이터에 관심이 많은 대학생입니다

0개의 댓글