안녕하세요
이번에는 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) 로 바꿔주는 것입니다
도움이 됐는지 모르겠습니다
감사합니다
'개발 Tools > 파이썬_Pandas & Numpy' 카테고리의 다른 글
pandas 행열 이름 바꾸기 (rename) (1) | 2021.07.27 |
---|---|
numpy 기본편-2 ( sort(), dot(), .T, transpose(), [::-1], 연산자, random, rand(), randint()) (0) | 2021.06.24 |
pandas 그룹으로 나누기 ( groupby(), agg() ) (0) | 2021.04.29 |
pandas 원하는 데이터 찾기 ( contains(), endswith(). tolist(), values ) + 서울에는 종합 병원이 얼마나 있을까? (0) | 2021.04.17 |
pandas 중복값 찾아보기 ( nunique(), unique(), value_counts() ) (0) | 2021.04.14 |
댓글