오늘부터 데이터 분석을 위한 파트가 시작됐다. 그 첫 번째로 다양한 데이터 분석과 AI 생태계의 기반인 NumPy와, 앞으로 배울 많은 패키지를 관리하고 가상 환경 구축을 도와주는 Anaconda에 대해 간단히 배웠다.
데이터 분석, 머신 러닝 등에 사용하는 여러가지 패키지가 기본적으로 포함 되어 있는 파이썬 패키지 관리자
가상환경이 필요한 이유
프로젝트마다 라이브러리와 패키지가 충돌 할 수 있기때문
프로젝트별로 독립적인 작업 환경 구축 가능
conda env list = 현재 존재하는 가상환경 조회conda create -n 이름 python=13.3 = 새로운 가상환경 생성 (파이썬 버전 설정 가능)conda activate 이름 = 가상환경 실행conda deactivate 이름 = 가상환경 종료conda list -n 이름 = 가상환경 내 패키지 목록 확인conda remove -n 이름 --all = 가상환경 삭제행렬이란?
숫자나 수식을 가로줄(행)과 세로줄(열)로 배열한 2차원 구조의 수학적 객체
import numpy as np
List vs ndarray
- 자료형의 차이
- List : 다양한 자료형을 담을 수 있는 가변 길이의 시퀀스 자료형
- ndarray : 동일한 자료형의 데이터를 정해진 크기의 다차원 배열로 저장
- 내부 배열의 원소 개수
- List : 내부 배열의 원소 개수가 달라도 됨
- ndarray : 내부 배열의 원소 개수가 같아야 함
- 연산의 차이
- List : 리스트끼리의 + 가능 (리스트의 병합)
- ndarray : 같은 위치의 원소끼리 연산 (원소의 개수가 다를 경우 오류 발생)
# ndarray 생성
a = np.array([[1,2,4], [4,5,6]])
b = np.array([1.0,2.3,3.14])
# 배열의 구조
print(f"배열의 구조 : {a.shape}")
# 배열의 구조 : (2, 3)
# 배열의 차원 수
print(f"배열의 차원 : {a.ndim}")
# 배열의 차원 : 2
# 데이터 타입
print(f"배열의 데이터 타입 : {a.dtype}")
print(f"배열의 데이터 타입 : {b.dtype}")
# 배열의 데이터 타입 : int64 / 정수가 표현할 수 있는 용량 = 64 비트
# 배열의 데이터 타입 : float64 / 실수가 표현할 수 있는 용량 = 64 비트
# 형변환
new_a = a.astype(np.float64)
print(f"배열의 데이터 타입 : {new_a.dtype}")
# 배열의 데이터 타입 : float64
a = np.array([[[1,2,4], [4,5,6]], [[1,2,4], [4,5,6]]])
print(f"배열의 구조 : {a.shape}")
print(f"배열의 차원 : {a.ndim}")
# 배열의 구조 : (2, 2, 3)
# 배열의 차원 : 3
a = np.array([[[[1,2,4], [4,5,6]], [[1,2,4], [4,5,6]]], [[[1,2,4], [4,5,6]], [[1,2,4], [4,5,6]]]])
print(f"배열의 구조 : {a.shape}")
print(f"배열의 차원 : {a.ndim}")
# 배열의 구조 : (2, 2, 2, 3)
# 배열의 차원 : 4
a = np.array([[1], [2,3]]) # ValueError
np.zeros((3, 4)) # 2차원
# array([[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]])
np.zeros((2, 3, 4), dtype=np.int64) # 3차원 / 데이터 타입 지정 가능
# array([[[0, 0, 0, 0],
# [0, 0, 0, 0],
# [0, 0, 0, 0]],
# [[0, 0, 0, 0],
# [0, 0, 0, 0],
# [0, 0, 0, 0]]])
np.ones((5,6))
# array([[1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1.]])
np.empty((2,3)) # 쓰레기 값 = 메모리에 남아있던 값
# array([[4.9e-324, 9.9e-324, 2.0e-323],
# [2.0e-323, 2.5e-323, 3.0e-323]])
np.full((3,3), 7)
# array([[7, 7, 7],
# [7, 7, 7],
# [7, 7, 7]])
np.eye(3,3)
# array([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
np.eye(3,5,1) # 3번째 인자를 입력하면 1이 오른쪽으로 이동
# array([[0., 1., 0., 0., 0.],
# [0., 0., 1., 0., 0.],
# [0., 0., 0., 1., 0.]])
np.arange(0, 10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(0, 10, 2)
# array([0, 2, 4, 6, 8])
np.linspace(10, 100, 10)
# array([ 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.])
np.linspace(0.1, 1, 10)
# array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
np.linspace(1, 10, 6).reshape((2,3))
# array([[ 1. , 2.8, 4.6],
# [ 6.4, 8.2, 10. ]])
np.linspace(1, 10, 10).reshape((2,3)) # ValueError
np.random.rand(2,3)
# array([[0.72780303, 0.82995047, 0.38476608],
# [0.84412908, 0.29035368, 0.5260673 ]])
np.random.randn(2,2,3)
# array([[[ 1.23783806, 1.0700067 , 1.01619099],
# [-1.26835453, -0.49229975, 1.59009656]],
# [[ 1.84248661, -0.25435332, -1.44099114],
# [ 0.00508073, -0.55274915, -0.24587321]]])
np.random.randint(0, 101, (3, 3))
# array([[36, 76, 50],
# [32, 83, 34],
# [33, 61, 3]])
np.random.seed(42)
print(np.random.rand(2,3))
print(np.random.randn(2,2))
print(np.random.randint(0, 101, (3, 3)))
# [[0.37454012 0.95071431 0.73199394]
# [0.59865848 0.15601864 0.15599452]]
# [[ 1.57921282 0.76743473]
# [-0.46947439 0.54256004]]
# [[63 59 20]
# [32 75 57]
# [21 88 48]]
from numpy.random import default_rng
rng = default_rng(seed=42)
rng2 = default_rng(seed=10) # 시드값 변경으로 독립적으로 시드 사용 가능
rng3 = default_rng() # 시드 사용 안해도 가능
# 0~1 사이의 난수
print(rng.random((2,3)))
# [[0.77395605 0.43887844 0.85859792]
# [0.69736803 0.09417735 0.97562235]]
# 정규 분포
print(rng.normal(0, 1, (2,3)))
# [[ 0.1278404 -0.31624259 -0.01680116]
# [-0.85304393 0.87939797 0.77779194]]
# 정수 난수
print(rng.integers(0, 100, (3,3)))
# [[78 64 40]
# [82 54 44]
# [45 22 9]]
# 균등 분포
print(rng.uniform(0, 100, (3,2)))
# [[ 6.38172561 82.7631172 ]
# [63.16643991 75.80877401]
# [35.45259681 97.06980244]]
Anaconda를 사용하니 가상 환경을 매우 간단하게 구축할 수 있어서 앞으로 자주 사용할 것 같다. NumPy는 데이터 관련 작업의 기반이기 때문에 지금부터 잘 공부해둬야 할 것 같다.
이번 파트부터는 확실히 데이터 관련 수업이다 보니 수학적 용어나 지식이 많이 나와서, 따로 수학 공부도 시작해야겠다는 필요성을 느낀 하루였다.