NumPy 필수 함수 활용 가이드: Google Colab 실습을 중심으로

 NumPy는 과학 계산을 위한 Python의 핵심 라이브러리로, 대규모 다차원 배열 처리와 고수준 수학 함수를 효율적으로 제공합니다. 머신러닝 알고리즘 구현부터 시계열 데이터 분석에 이르기까지 현대 데이터 과학의 기반을 이루는 이 라이브러리의 핵심 기능들을 Google Colab 환경에서 직접 실습해보며 그 활용 방법을 탐구합니다. 본 가이드는 2025년 현재 최신 NumPy 2.1.0 버전을 기준으로 작성되었으며, 모든 코드 예제는 Google Colab에서 즉시 실행 가능하도록 구성되었습니다.


 1. Google Colab 환경 설정


 1.1 Colab 기본 설정

Google Colab은 클라우드 기반 Jupyter 노트북 환경으로, 별도의 설치 없이 웹 브라우저에서 Python 코드 실행이 가능합니다. 새로운 Colab 노트북 생성 시 기본적으로 NumPy가 설치되어 있으나, 최신 버전 사용을 위해 다음 명령어를 실행합니다:


# python

!pip install --upgrade numpy

#


런타임 유형 확인은 상단 메뉴에서 '런타임' → '런타임 유형 변경'을 선택하여 GPU/TPU 가속기 사용 가능 여부를 확인할 수 있습니다. 대규모 행렬 연산 시 하드웨어 가속을 활성화하면 성능 향상 효과를 기대할 수 있습니다.


1.2 데이터 파일 연동

로컬 파일 시스템과의 연동을 위해 Google Drive 마운팅을 수행합니다:


# python

from google.colab import drive

drive.mount('/content/drive')


import numpy as np

import os


# 데이터 파일 경로 설정

data_path = '/content/drive/MyDrive/Colab Notebooks/data/'

os.chdir(data_path)

#


이 설정을 통해 Drive에 저장된 CSV/TXT 파일을 직접 불러와 NumPy 배열로 변환할 수 있습니다. 예를 들어 해양 관측 데이터 파일을 로드할 때는 `np.genfromtxt()` 함수를 활용하며, 헤더 라인 스킵과 데이터 타입 지정이 가능합니다.


  2. 배열 생성 기법


2.1 기본 생성 함수

NumPy 배열 생성의 기본 패턴은 Python 리스트 변환 방식입니다:


# python

basic_arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)

print(f"배열 차원: {basic_arr.ndim}\n모양: {basic_arr.shape}\n데이터 타입: {basic_arr.dtype}")

#


배열 차원: 2

모양: (2, 3)

데이터 타입: float32



이 방식은 단순한 구조의 배열 생성에 적합하지만, 대규모 데이터셋 처리에는 비효율적일 수 있습니다. 대체 생성 함수들의 성능 비교 실험 결과, `np.empty()`가 초기화 과정을 생략하기 때문에 가장 빠른 실행 속도를 보였습니다. 


 2.2 특수 배열 생성

규칙적인 패턴의 배열 생성에는 전용 함수들이 효율적입니다:


# python

zeros_3d = np.zeros((2,3,4), dtype=np.int16)  # 3차원 제로 텐서

ones_matrix = np.ones((5,5))                 # 5x5 단위 행렬

identity = np.eye(4)                         # 4x4 항등행렬

random_arr = np.random.rand(1000,1000)       # 균등분포 난수 배열

#


특히 `np.arange()` 함수는 수열 생성에 최적화되어 있으며, 부동소수점 증분 지원을 통해 정밀한 제어가 가능합니다:


# python

float_seq = np.arange(2.5, 5.1, 0.3, dtype=np.float64)

# 출력: [2.5 2.8 3.1 3.4 3.7 4.0 4.3 4.6 4.9]

#


 3. 배열 조작 기술


3.1 인덱싱과 슬라이싱

4차원 텐서를 활용한 고급 인덱싱 사례:


# python

tensor_4d = np.random.randint(0,100,(3,4,5,6))

print(tensor_4d[1, 2:4, ::2, -3:].shape)  # (2, 3, 3)

#


불리언 인덱싱을 이용한 조건 필터링:


# python

data = np.random.normal(0, 1, 1000)

filtered = data[(data > -1.5) & (data < 1.2)]

#


3.2 배열 변형

다차원 배열 재구성 예제:


# python

original = np.arange(24)

reshaped = original.reshape(2,3,4)  # 3차원 구조 변환

transposed = reshaped.transpose(1,0,2)  # 축 순서 변경

#


벡터 결합 연산:


# python

a = np.array([1,2,3])

b = np.array([4,5,6])

stacked = np.vstack([a,b])  # 수직 결합

#


 4. 수학 연산 최적화


4.1 벡터화 연산

대규모 데이터 처리 시 순수 Python 루프 대비 100배 이상의 성능 차이를 보입니다:


# python

def python_sum(size):

    result = 0

    for i in range(size):

        result += i

    return result


%timeit python_sum(1_000_000)

# 136 ms ± 5.12 ms per loop


%timeit np.sum(np.arange(1_000_000))

# 1.23 ms ± 0.08 ms per loop

#


4.2 선형대수 연산

행렬 분해와 고윳값 계산:


# python

matrix = np.random.rand(100,100)

eigenvalues, eigenvectors = np.linalg.eig(matrix)

#


특이값 분해(SVD) 활용:


# python

U, s, Vh = np.linalg.svd(matrix, full_matrices=False)

#


 5. 고급 파일 입출력


 5.1 구조화 데이터 로딩

`np.genfromtxt()`를 이용한 복합 데이터 처리:


# python

ocean_data = np.genfromtxt('ocean_sensor.csv', delimiter=',', 

                          skip_header=14, usecols=(0,1,2,3),

                          dtype=[('date', 'U10'), ('temp', 'f4'), 

                                 ('salinity', 'f4'), ('ph', 'f4')])

#


5.2 메모리 매핑

대용량 파일 처리 시 메모리 효율성 확보:


# python

large_array = np.memmap('bigdata.dat', dtype=np.float32, 

                       mode='r+', shape=(1000000, 100))

#


 6. 데이터 타입 관리

 

 6.1 타입 변환 전략

이미지 데이터 처리 사례:


# python

raw_image = np.random.randint(0,256,(1080,1920,3), dtype=np.uint8)

float_image = raw_image.astype(np.float32) / 255.0

#

 6.2 타입 프로모션 규칙

혼합 연산 시 자동 타입 변환 규칙:


# python

int_arr = np.array([1,2,3], dtype=np.int32)

float_arr = np.array([1.5, 2.5, 3.5], dtype=np.float64)

result = int_arr * float_arr  # 결과 타입: float64

#


 7. 성능 최적화 기법


 7.1 뷰(View) vs 복사본(Copy)

메모리 사용 최적화를 위한 뷰 활용:


# python

original = np.arange(10)

view = original[::2]  # 메모리 공유

copy = original[::2].copy()  # 독립 복사본

#

 7.2 브로드캐스팅 규칙

차원 확장을 통한 효율적 연산:


# python

A = np.ones((100, 1, 5))

B = np.ones((1, 200, 5))

C = A + B  # 결과 차원: (100, 200, 5)

#


 결론


NumPy의 강력한 배열 처리 기능은 현대 데이터 과학의 기반 인프라로 자리잡았습니다. Google Colab과의 연동을 통해 접근성과 확장성을 동시에 확보한 본 실습 가이드는 이론과 실무의 간극을 메우는 실용적 교육 도구로 활용될 수 있습니다. 향후 연구과제로는 NumPy의 Dask 연동을 통한 분산 처리 확장, JAX 프레임워크와의 결합을 통한 자동 미분 기능 강화 등을 고려해볼 수 있습니다. 실무 적용 시 반드시 메모리 사용 패턴을 모니터링하고, `np.savez_compressed()`와 같은 압축 저장 방식을 활용하여 스토리지 효율성을 높이는 전략이 필요합니다.







#NumPy #Python #DataScience #GoogleColab #배열처리 #과학계산 #머신러닝 #데이터분석 #코딩튜토리얼 #선형대수 #성능최적화 #파이썬라이브러리 #프로그래밍실습 #데이터시각화 #AI개발 #빅데이터 #수치연산 #벡터화 #파일입출력 #메모리관리



0 댓글