본문 바로가기
개발 Tools/파이썬_Pandas & Numpy

numpy 기본편-1 ( array(), dtype, shape, astype(), arange(), zeros(), ones() , reshape(),reshape(-1,1) )

by 전컴반 2021. 6. 23.
반응형

안녕하세요

이번에는 numpy의 모든 것에 대해 정리해보겠습니다

내용이 조금 있는 관계로 1편 2편으로 나눌 예정입니다

 

어느 정도만 알고 있으면 따로 공부할 필요가 없고 실제로 사용하면서 실력을 성장시키면 될 거 같습니다.

시작해보겠습니다

import numpy

 

먼저 import 를 사용하여 불러옵니다

"np" 라는 이름으로 numpy 를 불러옵니다

 

import numpy as np

 

차원

 

numpy 에는

1차원

2차원(2D)

3차원(3D)

이 존재합니다

 

1차원

 

1차원을 먼저 출력해 보겠습니다

 

array1 = np.array([1, 2, 3])
print(type(array1))
print(array1.shape)
print(array1, "\n")

출력
<class 'numpy.ndarray'>
(3,)
[1 2 3] 

 

마지막에 "\n" 역슬래시 n 은 줄 바꿈 표시입니다. 의미 없는 코드니 혼동 없으시길 바랍니다

 

shape 이 왜 (3,) 인지 이해가 안 됐습니다. 1행 3열로 이해해서 그렇습니다

 

1차원이라 "행렬"이라는 개념 자체가 존재하지 않습니다. 그렇다면 무슨 의미냐, (3,) 은 3개의 벡터가 존재한다 입니다.

행렬의 개념이 아니라 백터의 개념입니다

 

2차원

 

2차원은 어떻게 될까요?

 

array2 = np.array([[1, 2, 3], [4, 5, 6]])
print(type(array2))
print(array2.shape)
print(array2, "\n")

출력
<class 'numpy.ndarray'>
(2, 3)
[[1 2 3]
 [4 5 6]] 

 

차원의 수는 "[]" 의 수로 구분 가능합니다.

1차원은 []

2차원은 [[]]

3차원은 [[[]]] 입니다

 

이제야 shape 이 저희가 아는 행렬의 개념으로 출력됩니다

 

array의 데이터 타입이 다를 때

 

지금은 배열의 내용이 다 정수형이었습니다. 만약 정수형이 아닌 문자형이나 실수형이라면 어떻게 될까요?

 

정수+문자 타입일 때

 

먼저 정수와 문자가 같이 있을 때 바뀌는 걸 보겠습니다

 

list1 = [1, 2, "t"]
array4 = np.array(list1)
print(array4, array4.dtype, "\n")

출력
['1' '2' 't'] <U11 

 

출력 값을 보시면 아시겠습니다만 정수가 문자형으로 바뀌었습니다. 뭔가 이상합니다. 그럼 바로 다른 데이터 타입의 조합을 보겠습니다

 

정수+실수 타입일 때

 

정수와 실수의 조합을 어떻게 될까요?

 

list2 = [1, 2, 3.0]
array5 = np.array(list2)
print(array5, array5.dtype, "\n")

출력
[1. 2. 3.] float64 

 

정수가 실수형으로 바뀌는 걸 확인할 수 있습니다

 

그렇습니다. 하나의 리스트에 다른 데이터 타입이 있을 때 np.array() 로 변환 시, 데이터 타입이 더 큰 걸 따라갑니다. 정수형 < 실수형 < 문자형 순으로 데이터 타입이 큽니다

 

데이터 타입의 변환 

이번에는 데이터 타입의 변환입니다. 만약 정수형으로 충분하다면 굳이 실수형 숫자를 쓸 필요는 없습니다. 메모리만 더 잡아먹고 연산량만 키우기 때문입니다.

이처럼 데이터 타입의 변환이 필요할 때가 있습니다. 바로 코드를 보겠습니다

 

array_float1 = np.array([1.2, 3.4, 2.3])
array_int1 = array_float1.astype("int")
print(array_int1, array_int1.dtype, "\n")

출력
[1 3 2] int32 

 

astype("원하는 형") 으로 변환합니다

간단하죠?

 

arange()

 

이번에는 range() 와 유사한 arange() 를 알아보겠습니다. range() 와 유사하게 arange(start=, stop=, step=) 으로 구분됩니다

 

sequence_array = np.arange(0, 10, 1)  # == arange(10)
print(f"np.arange(10) = {sequence_array}")
print(f"np.arange(10).shape={sequence_array.shape}\n")

출력
np.arange(10) = [0 1 2 3 4 5 6 7 8 9]
np.arange(10).shape=(10,)

 

보시다시피 1차원 임을 알 수 있습니다. 0부터 시작임에 주의합니다

+ print() 안에 f"{}" 는 포맷 형태로, "" 안에 있는 건 그대로 출력하며 {} 안에는 변수나 값을 집어넣을 수 있습니다 

 

zeros 배열

 

우리는 종종 모든 값이 0인 영배열이나 모든 값이 1인 단위 배열이 필요할 때가 있습니다. 원하는 행과 열을 주면 생성해주는 함수가 있습니다

 

zere_array = np.zeros((3, 2), dtype="int")
print(zere_array)
print(f"zere_array.dtype={zere_array.dtype} / zere_array.shape={zere_array.shape}\n")

출력
[[0 0]
 [0 0]
 [0 0]]
zere_array.dtype=int32 / zere_array.shape=(3, 2)

 

3행 2열의 배열이 생성됐습니다. 만약 dtype 를 지정해주지 않으면 default 값으로 float로 들어갑니다

 

ones 배열

 

단위 배열의 생성입니다. zero 배열과 사용법이 똑같습니다

 

one_array = np.ones((3, 2))
print(one_array)
print(f"one_array.dtype={one_array.dtype} / one_array.shape={one_array.shape}\n")

츨력
[[1. 1.]
 [1. 1.]
 [1. 1.]]
one_array.dtype=float64 / one_array.shape=(3, 2)

 

마찬가지로 2차원 배열입니다. 보시다시피 dtype=float64 로 dtype 을 정해주지 않으면 float로 들어갑니다

 

배열의 차원 변환 reshape()

 

때론 필요에 맞게 행과 열의 모양을 변환해야 합니다. 이때 쓰는 함수입니다

 

array6 = np.arange(start=0, stop=10)
array7 = array6.reshape(2, 5)
print(f"np.arange(10)=\n{np.arange(10)}")
print(f"array6.reshape(2, 5)=\n{array7}\n")

출력
np.arange(10)=
[0 1 2 3 4 5 6 7 8 9]
array6.reshape(2, 5)=
[[0 1 2 3 4]
 [5 6 7 8 9]]

 

변하기 전과 후의 출력입니다. 1차원에서 2차원으로 변환한 것입니다

만약 10개면 (5x2) 나 (2x5) 로 만 변환이 가능합니다. 즉, 짝이 맞아야 변환이 가능합니다

 

reshape 의 저력은 (-1) 에 있습니다. (-1) 은 앞이나 뒤의 숫자를 보고 자동으로 변환합니다

예시를 보시면 더 이해가 빠르실 겁니다

 

array8 = array6.reshape(-1, 5)
array9 = array6.reshape(5, -1)
print(f"array6.reshape(-1,5)=\n{array6.reshape(-1, 5)}")
print(f"array6.reshape(5,-1)=\n{array6.reshape(5, -1)}", "\n")

출력
array6.reshape(-1,5)=
[[0 1 2 3 4]
 [5 6 7 8 9]]
array6.reshape(5,-1)=
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]] 

 

이처럼 (2,5) 를 입력하지 않아도 자동으로 알맞게 변환합니다. 오류가 뜰 일이 없겠죠?

그렇지만 저희는 reshape(-1,1) 을 주로 사용할 것입니다. 어떤 형태이든 2차원의 형태로 바꿔주고 합치거나 분리할 때 편하기 때문입니다

 

print(f"array6.reshape(-1,1)=\n{array6.reshape(-1,1)}\n")

출력
array6.reshape(-1,1)=
[[0]
 [1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]
 [8]
 [9]]

 

행렬로 이해하자면 (n,1) 로 바꿔주는 것입니다

 

도움이 됐는지 모르겠습니다

감사합니다

 

반응형

댓글