Numpy 기초

손주현·2024년 10월 11일

Numpy

목록 보기
1/7
post-thumbnail

Numpy란?

  • Numerical Python의 약자로, 파이썬에서 과학 계산을 위한 대표적인 라이브러리이다.
  • 주요 기능
    • 배열 연산 (ndarry) : numpy의 핵심 데이터 구조는 다차원 배열인 ndarry이다.
      이 배열은 일반적인 파이썬 리스트보다 빠르고, 효율적인 메모리 사용을 자랑하는 특징이 있으며 이를 통해 대규모 데이터의 수치 연산을 매우 빠르게 처리할 수 있다.
    • 벡터화된 연산 : Numpy는 배열 간의 연산을 벡터화된 방식으로 처리할 수 있어, 반복문을 사용하지 않고도 빠른 수치 연산을 수행할 수 있다.
    • 다양한 수학 함수 제공 : Numpy는 선형대수, 푸레에 변환, 난수 생성 등 다양한 수학적 함수들을 제공하여 이를 통해 복잡한 수학적 계산을 간단하게 처리할 수 있다.
    • 고성능 : Numpy는 내부적으로 c언어로 구현되어 있어, 파이썬의 기본 자료형보다 훨씬 빠른 성능을 제공한다.

numpyarraylist의 차이점

numpyarray와 Python의 기본 자료형인 list는 둘 다 데이터를 저장하고 처리하는 데 사용되지만, 몇 가지 중요한 차이점이 있다.

1. 데이터 타입 (Data Type)

  • numpyarray:
    • numpy 배열은 동일한 데이터 타입을 가진 값만 저장할 수 있다. 즉, 모든 요소는 같은 자료형이어야 하며, 이는 배열의 메모리 관리와 연산 속도를 높이는데 도움이 됨.
    • 예를 들어, numpy 배열은 모두 정수형, 부동 소수점형, 혹은 문자열 등 특정 하나의 자료형으로 통일되어야 합니다.
  • Python의 list:
    • list다양한 데이터 타입을 혼합해서 저장이 가능하다. 즉, 정수, 문자열, 부동 소수점, 심지어 다른 리스트도 한 리스트 안에 포함될 수 있다.
import numpy as np

np_arr = np.array([1, 2, 3, 4, 5]) # numpy안의 자료형은 통일 되어야 함
ls = [1, 2.5, "hello", [3, 4]] # list 자료형은 데이터 타입이 통일되지 않아도 됨

2. 메모리 사용과 성능 (Memory Usage and Performance)

  • numpyarray:

    • numpy 배열은 메모리를 연속적으로 사용하여 배열을 효율적으로 관리한다. 이는 메모리 상에서 데이터가 한 블록에 저장되기 때문에 CPU 캐시 효율이 높아지고, 특히 대용량 데이터 처리 시 성능이 매우 뛰어나다.
    • 수학적 연산을 numpy 배열에서 수행하면 내부적으로 C로 구현된 고속 연산을 사용하므로 성능이 list보다 훨씬 빠르다.
  • Python의 list:

    • list비연속적인 메모리 구조를 가지며, 리스트 내 각 요소가 메모리 상에서 따로따로 저장될 수 있다. 그래서 대용량 데이터 처리 시 메모리 접근 시간이 길어질 수 있다.
    • 또한 리스트는 다양한 타입을 저장할 수 있어 메모리 관리가 비효율적일 수 있으며, 수치 연산 등의 작업에서 성능이 numpy 배열보다 떨어진다.

3. 연산 효율성 (Computational Efficiency)

  • numpyarray:
    • numpy 배열은 벡터화 연산을 지원한다. 즉, 배열 전체에 대해 한 번에 연산을 적용할 수 있다.
      예를 들어, 배열의 모든 요소에 대해 덧셈, 곱셈 등의 연산을 일괄적으로 적용할 수 있어 루프 없이 고속으로 연산을 수행할 수 있다.
  • Python의 list:
    • list벡터화 연산을 지원하지 않으며, 각 요소에 대한 연산을 개별적으로 처리해야 한다.
      따라서 리스트의 각 요소에 대해 수학적 연산을 할 때는 반복문을 사용해야 하므로 속도가 느리다.
import numpy as np

a = np.array([1, 2, 3])
a_mul2  = a * 2 # [2 4 6]을 즉시 얻음

ls = [1, 2, 3]
ls_mul2 = [x * 2 for x in ls] # 리스트 컴프리헨션이나 반복문을 사용
# 속도차이가 얼마나 나는지 확인해보자
# 벡터화 연산과 for 루프의 비교
arr = np.random.random(1000000) # 100만개의 난수 생성

%timeit np.sum(arr)

# for 루프의 연산
def slow_sum(arr):
  total = 0
  for i in arr:
    total += i
  return total

%timeit slow_sum(arr)
결과
374 μs ± 28 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
88.9 ms ± 2.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

벡터화 연산의 평균 실행 시간은 374 마이크로초(μs)
for 루프 방식의 평균 실행 시간은 88.9 밀리초(ms)

for 루프 연산이 벡터화 연산에비해 약 238배 느림

4. 함수 및 메서드 지원 (Functions and Methods Support)

  • numpyarray:
    • numpy는 배열을 처리하기 위한 다양한 내장 함수와 메서드를 제공한다.
      행렬 연산, 통계, 선형 대수, 난수 생성 등 수많은 수학적 연산이 최적화된 형태로 제공된다.
  • Python의 list:
    • list는 배열에 비해 제공되는 함수가 제한적이다.
      요소 추가, 삭제 등의 기본적인 메서드는 있지만, 수학적 연산이나 통계 관련 함수는 따로 구현해야 하거나 numpy 같은 라이브러리를 사용해야 한다.
  • numpy의 내장함수와 메서드는 다음 글에서 다룬다.

5. 크기 변경 (Resizing)

  • numpyarray:
    • numpy 배열은 고정 크기이다.
      한 번 배열이 생성되면 그 크기를 직접 변경하는 것은 불가능하며, 배열의 크기를 변경하려면 새로운 배열을 만들어야 한다.
  • Python의 list:
    • list가변 크기를 가지므로 자유롭게 요소를 추가하거나 삭제할 수 있다.
      이 점에서 리스트는 동적인 크기의 데이터를 다룰 때 유용하다.

6. 사용 예 (Use Case)

  • numpyarray:
    • 주로 과학적 계산이나 대용량 데이터 처리에 적합하며, 수학적 연산이나 벡터/행렬 연산에서 매우 효율적이다.
      따라서 데이터 분석, 머신 러닝, 시뮬레이션 등에서 자주 사용된다.
  • Python의 list:
    • 리스트는 일반적인 데이터 저장다양한 자료형을 다룰 때 유용하다.
      다양한 타입의 데이터를 동적으로 추가하거나 제거할 때 많이 사용된다.

요약

  • numpy 배열은 고성능 수치 연산에 최적화된 배열형 자료구조로, 메모리 효율성과 연산 속도가 매우 뛰어나다.
  • Python의 리스트는 다양한 데이터 타입을 혼합하여 다룰 수 있고 크기를 자유롭게 변경할 수 있어 보다 일반적인 용도로 사용된다.
profile
Clarinetist.dev

0개의 댓글