250731 [ Day 19 ] - NumPy (1)

TaeHyun·2025년 7월 31일

TIL

목록 보기
19/182

시작하며

오늘부터 데이터 분석을 위한 파트가 시작됐다. 그 첫 번째로 다양한 데이터 분석과 AI 생태계의 기반인 NumPy와, 앞으로 배울 많은 패키지를 관리하고 가상 환경 구축을 도와주는 Anaconda에 대해 간단히 배웠다.

Anaconda

  • 데이터 분석, 머신 러닝 등에 사용하는 여러가지 패키지가 기본적으로 포함 되어 있는 파이썬 패키지 관리자

    • 파이썬 가상 환경을 구축하는데도 유용하게 사용
  • 가상환경이 필요한 이유

프로젝트마다 라이브러리와 패키지가 충돌 할 수 있기때문
프로젝트별로 독립적인 작업 환경 구축 가능


Anaconda 관련 명령어

  • conda env list = 현재 존재하는 가상환경 조회
  • conda create -n 이름 python=13.3 = 새로운 가상환경 생성 (파이썬 버전 설정 가능)
  • conda activate 이름 = 가상환경 실행
  • conda deactivate 이름 = 가상환경 종료
  • conda list -n 이름 = 가상환경 내 패키지 목록 확인
  • conda remove -n 이름 --all = 가상환경 삭제

NumPy

  • 다차원 배열(행렬)을 쉽게 처리하고 효율적으로 사용할 수 있도록 지원하는 파이썬의 라이브러리
    • Numerical Python 의 약자
    • 수치해석, 통계 관련 기능을 구현한다고 할 때 가장 기본이 되는 모듈

행렬이란?

숫자나 수식을 가로줄(행)과 세로줄(열)로 배열한 2차원 구조의 수학적 객체

  • NumPy는 파이썬의 리스트보다 효율적이며 빠른 계산이 가능
  • Pandas, TensorFlow 등 다양한 데이터 / AI 생태계의 기반
import numpy as np
  • 대부분 임포트시 np라는 별칭 사용

ndarray

  • NumPy의 핵심 데이터 구조로, 동일한 자료형을 가진 다차원 배열
    • 파이썬의 리스트보다 성능과 메모리 효율성에서 우수

List vs ndarray

  1. 자료형의 차이
    1. List : 다양한 자료형을 담을 수 있는 가변 길이의 시퀀스 자료형
    2. ndarray : 동일한 자료형의 데이터를 정해진 크기의 다차원 배열로 저장
  2. 내부 배열의 원소 개수
    1. List : 내부 배열의 원소 개수가 달라도 됨
    2. ndarray : 내부 배열의 원소 개수가 같아야 함
  3. 연산의 차이
    1. List : 리스트끼리의 + 가능 (리스트의 병합)
    2. ndarray : 같은 위치의 원소끼리 연산 (원소의 개수가 다를 경우 오류 발생)

차원과 축

  • 차원 (Dimension) : 배열이 몇 단계로 중첩되어 있는지를 나타냄
    • 1D : [ 1, 2, 3 ]
    • 2D : [ [ 1, 2 ], [ 3, 4 ] ]
    • 3D : [ [ [ 1 ], [ 2 ] ], [ [ 3 ], [ 4 ] ] ]
  • 축 (Axis) : 다차원 배열의 특정 방향을 의미함
    • axis=0 : 행 방향 (세로 축)
    • axis=1 : 열 방향 (가로 축)

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
  • 3차원 행열
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
  • 4차원 행열
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 

배열 초기화 함수

zeros( )

  • 모든 요소가 0인 배열 생성
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]]])

ones( )

  • 모든 요소가 1인 배열 생성
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.]])

empty( )

  • (원소의 값이) 초기화 되지 않은 배열 생성
np.empty((2,3)) # 쓰레기 값 = 메모리에 남아있던 값
# array([[4.9e-324, 9.9e-324, 2.0e-323],
#        [2.0e-323, 2.5e-323, 3.0e-323]])

full( )

  • 주어진 값으로 채운 배열
np.full((3,3), 7)
# array([[7, 7, 7],
#        [7, 7, 7],
#        [7, 7, 7]])

eye( )

  • 단위 행렬 : 행렬의 곱에서 자기 자신이 만들어지는 행렬
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.]])

범위 기반 배열 생성

arange( )

  • range( ) 함수와 유사한 기능을 제공
    • 시작 이상 끝 미만의 정수 배열을 지정한 간격으로 생성
  • 끝 미포함
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])

linspace( )

  • 시작부터 끝까지 균일 간격으로 지정한 개수만큼 숫자를 생성 (float)
  • 끝 포함
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. ])

reshape( )

  • 배열의 구조를 재배치
  • 원소의 개수가 같아야 함
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  

랜덤 배열 생성

random.rand(m, n)

  • 0~1사이의 난수로 초기화
  • m x n 크기의 배열 생성
  • 0 ≤ x < 1
np.random.rand(2,3)
# array([[0.72780303, 0.82995047, 0.38476608],
#        [0.84412908, 0.29035368, 0.5260673 ]])

random.randn(m, n)

  • 표준 정규분포를 따르는 난수로 초기화
  • 표준 정규분포 : 평균=0, 분산=1 인 정규분
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]]])

random.randint(low, high, (size))

  • 정수 배열 생성
np.random.randint(0, 101, (3, 3))
# array([[36, 76, 50],
#        [32, 83, 34],
#        [33, 61,  3]])

random.seed( )

  • 랜덤 난수의 초기화 값을 고정
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]]

RNG (Random Number Generator)

  • 최근 파이썬 사용에서 권장되는 방식
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는 데이터 관련 작업의 기반이기 때문에 지금부터 잘 공부해둬야 할 것 같다.
이번 파트부터는 확실히 데이터 관련 수업이다 보니 수학적 용어나 지식이 많이 나와서, 따로 수학 공부도 시작해야겠다는 필요성을 느낀 하루였다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글