1. numpy란?
2. ndarray
3. array의 형태
4. shape
5. ndim/size
6. dtype
7. reshape
1. numpy란?
파이썬 Numpy란 numerical python의 줄임말로 파이썬에서 수학적 처리를 도와주는 라이브러리입니다.
특히, numpy에선 다차원 배열의 계산에 대해 간편한 기능을 제공합니다.
1. python3 버전 확인
python3 --version
2. pip3 버전 확인
pip3 --version
# pip가 설치 안되어 있다면 설치하기
pip install
3. pip3로 numpy 설치
pip3 install numpy
2. ndarray
넘파이에선 특수한 어레이(array)를 사용하는데 ndarray를 사용합니다.
ndarray는 n-dimension-array를 의미합니다. 즉, 여러가지 차원을 다루는 배열이라고 생각할 수 있습니다.
# 넘파이 라이브러리 불러오기
import numpy as np
np.array() 메서드를 이용하여 ndarray를 생성할 수 있습니다.
# 1차원 배열
a = np.array([1, 2, 3, 4])
(모든 결과는 주피터 노트북에서 실행되었습니다.)
# 2차원 Array
x = np.array([[1,2,3,4],
[5,6,7,8]
])
print(x)
실행결과
[[1 2 3 4]
[5 6 7 8]]
# 3차원 배열
x = np.array([
[[1,2], [3,4]],
[[5,6], [7,8]],
])
print(x)
실행결과
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
3. Array의 형태
넘파이의 배열에는 축(axis)이라는 개념이 있습니다.
1차원 배열 - 축(axis) : 0으로 구성 / Vector라고 부름
2차원 배열 - 축(axis) : 0, 1으로 구성 / Metrix라고 부름
3차원 배열 - 축(axis) : 0, 1, 2로 구성 / Tensor라고 부름
axis=0은 2차원 배열에서 각 열의 모든 행에서 적용되고, aixs=1은 2차원 배열에서 각 행의 모든 열에서 적용됩니다.
aixs= 0은 행 방향(가로 방향)으로 행들이 쌓이면, 세로로 쌓일 수 밖에 없다. 책이 쌓이는 방향으로 생각할 수 있다.
aixs=1은 열 방향(세로 방향)으로 열들이 쌓이면, 가로로 쌓이게 된다. 서랍이 쌓이는 것과 같다.
aixs=0과 axis=1은 화살표 방향 대로 연산이 진행됩니다.
4. Shape
shape메서드를 이용해서 그 어레이의 형상을 알 수 있습니다. 형상이란 N차원 배열에서 각 차원의 크기를 의미합니다.
arr = np.array([1, 2, 3]) #1차원 배열
print(arr.shape)
>>> (3,)
1차원 배열에서 (m, )은 m칸으로 구성된 1차원 배열이라는 뜻입니다. 즉, 1차원 배열이고 (3, )이 나왔으니 열이 3개이고, 총 칸의 수도 3개 입니다.
arr2 = np.array([[1, 2, 3],
[4, 5, 6]]) #2차원 배열
print(arr2.shape)
print(arr2.sum(axis=0))
print(arr2.sum(axis=1))
>>> (2, 3)
>>> [5 7 9]
>>> [ 6 15]
2차원 배열에서의 (m, n)는 m행 n열로 구성된 2차원 배열을 의미합니다.
sum(axis=0)에서 axis=0은 행 위치를 따라가는 방향이므로 컬럼끼리 덧셈이 되어 "1+4= 5"가 됩니다.
또한 sum(axis=1)은 열 위치를 따라가는 방향이므로 행끼리 덧셈이 되어 "1+2+3=6"이 됩니다.
x = np.array([
[[1,2], [3,4]],
[[5,6], [7,8]],
])
print(x.shape)
>>> (2, 2, 2)
3차원 배열에서는 (층, 행, 열)로 표현됩니다. 위와 같은 경우의 행렬은 2층 2행 2열 형상입니다.
✦ 정리하면 1차원은 (열, ) 2차원은 (행, 열) 3차원은 (층, 행, 열)로 표현됩니다.
5. ndim/size 확인하기
ndim은 해당 배열의 차원, size는 해당 배열의 칸 수를 알 수 있습니다.
# 3차원 배열
x = np.array([
[[1,2], [3,4]],
[[5,6], [7,8]],
])
print(x.ndim)
print(x.size)
>>> 3
>>> 8
ndim으로 3차원 배열임을 알 수 있고, size로 총 원소의 수가 8개임을 알 수 있습니다.
x = np.array([[[0, 1, 2, 3],
[4, 5, 6, 7]],
[[0, 1, 2, 3],
[4, 5, 6, 7]],
[[0 ,1 ,2, 3],
[4, 5, 6, 7]]])
print(x.ndim)
>>> 3
print(x.shape)
>>> (3, 2, 4)
print(x.size)
>>> 24
6. dtype
dtype은 배열의 데이터 타입을 알려줍니다. 또한 배열의 데이터 타입을 직접 지정할때도 사용할 수 있습니다.
arr = np.array([1.1, 2.2, 3.3])
print(arr.dtype)
>>> float64
arr = np.array([1.1, 2.2, 3.3], dtype=int)
print(arr)
>>> [1 2 3]
print(arr.dtype)
>>> int32
정직하게 출력하면 float(실수)가 나오는것을 알 수 있습니다. 두번째는 dtype=int로 설정해줘서 정수값이 나오게 됩니다.
arr = np.array([1, 2, 3, 0], dtype=bool)
print(arr)
>> [True True True False]
숫자형 자료를 bool타입으로 변경했습니다.
또한 숫자를 문자형(string)으로 바꿀 수도 있습니다.
다만 문자를 숫자로 바꾸는 것은 할 수 없습니다.
7. reshape
reshape 함수는 ndarray의 차원과 모양을 바꿔줍니다.
단, ndarray만 형태 변환을 해줄 수 있습니다. 그래서 list, range, tuple등은 np.array()등의 작업을 거쳐줘야 합니다.
1. reshape 함수는 본래의 원형을 유지시킨다.
x = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]
x = np.array(x) # ndarray로 변경
print(x.reshape(4, 5))
>>> [[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
print(x.reshape(2, 2, 5))
>>> [[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
[[11 12 13 14 15]
[16 17 18 19 20]]]
print(x) # 원래 모양 유지
>>> [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
2. reshape에 매개변수 -1을 넣는 경우
x = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]
x = np.array(x)
print(x.reshape(4, -1)) # 데이터 개수 20개 = 4개의 행 x (?)개의 열
print(x.reshape(4, -1).shape) # 크기를 맞춰야 하기 때문에 -1에는 5가 들어감
>>> [[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
>>> (4, 5)
print(x.reshape(2, 5, -1)) # 데이터 개수 20개 = 3차원 층(2) x 2차원 행(5) x 1차원 열(?)
print(x.reshape(2, 5, -1).shape) # 크기를 맞춰야 하기 때문에 열에는 2가 들어감
>>> [[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]]
[[11 12]
[13 14]
[15 16]
[17 18]
[19 20]]]
>>> (2, 5, 2)
print(x.reshape(-1)) # 1차원(?) -> 20이 된다.
>>> [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
✦ 2차원이나 3차원 배열을 만들때는 -1을 하나의 매개 변수에 넣는다면 세 수를 곱해서 총 데이터의 개수가 되도록 하면 됩니다.
'[머신러닝] > [Numpy, Pandas]' 카테고리의 다른 글
[Numpy] np.arange 사용법과 range와의 차이 (0) | 2023.06.16 |
---|---|
[Pandas] 판다스 설치 (0) | 2023.06.15 |
[Numpy] list와 tuple 자료형의 차이 (0) | 2023.06.14 |
[Numpy] 파이썬 list comprehension (0) | 2023.06.14 |
[Numpy] Broadcasting이란? (브로트 캐스트 규칙) (0) | 2023.06.13 |