본문 바로가기

Python

[Python] 넘파이(Numpy) 배열

728x90

넘파이(Numpy)란?

NumpyPython 기반의 수치 해석 라이브러리로, 선형대수 연산 및 다차원 배열 처리를 위한 다양한 함수를 제공합니다. Numerical Python의 약자이며, 과학 컴퓨팅과 데이터 분석에 자주 사용됩니다.

 

Numpy 설치 및 사용 방법

pip install numpy
# np(줄인말)는 표준화가 되어 있으며 numpy는 np로 사용합니다
import numpy as np

 

 

 

Numpy 배열과 파이썬 리스트의 차이점

연산 가능 여부

np.array([1, 2, 3]) + np.array([4, 5, 6])  # 결과: [5, 7, 9]
[1, 2, 3] + [4, 5, 6]  # 결과: [1, 2, 3, 4, 5, 6]

 

  • Numpy: 배열 간 수학 연산 가능
  • Python List: 덧셈 시 요소 연결

 

 

스칼라 연산 지원 여부

np.array([1, 2, 3]) + 2  # 결과: [3, 4, 5]
[1, 2, 3] * 2  # 결과: [1, 2, 3, 1, 2, 3]
  • Numpy: 배열의 모든 요소에 스칼라 연산 적용 가능
  • Python List: 곱셈만 반복으로 해석

성능 차이

  • Numpy 배열연산 속도가 빠르고 메모리 효율이 높습니다.
  • Python 리스트는 유연하지만 대규모 데이터 처리에 적합하지 않습니다.

 

 

 

 

Numpy 배열의 특징

  1. 모든 요소의 타입이 동일해야 합니다.
  2. 각 차원(Dimension)을 축(axis)이라고 부릅니다.

 

 

 

Numpy 배열의 주요 속성

  • .shape: 배열의 각 축의 크기
  • .ndim: 배열의 차원 개수
  • .dtype: 배열 요소의 데이터 타입
  • .itemsize: 요소의 바이트 크기
  • .size: 배열의 전체 요소 개수

예시 (2차원 배열)

a = np.arange(12).reshape(3, 4)
print(a)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

 

  • .shape: (3, 4)
  • .ndim: 2
  • .dtype: int64
  • .itemsize: 8 (int64의 바이트 크기)
  • .size: 12

 

 

Numpy 배열 생성 방법

np.array: 튜플이나 리스트로 배열 생성

a = np.array([1, 2, 3])
print(a, a.dtype)  # [1 2 3] int64

 

np.zeros, np.ones, np.empty, np.full

  • np.zeros(shape): 0으로 구성된 배열 생성
  • np.ones(shape): 1로 구성된 배열 생성
  • np.empty(shape): 초기화되지 않은 배열 생성 (쓰레기 값 포함)
  • np.full(shape, value): 특정 값으로 초기화된 배열 생성
print(np.zeros((3, 4)))
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
 
 
print(np.ones((2, 3, 4)))
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]
  
  
print(np.empty((3, 2)))
[[4.95350151e-310 0.00000000e+000]
 [3.68067497e+180 2.46345036e-154]
 [2.65141253e+180 3.99461109e+252]]
 
 
print(np.full((3, 4), 10))
[[10 10 10 10]
 [10 10 10 10]
 [10 10 10 10]]

 

 

Numpy arange, linspace로 데이터 생성

np.arange와 np.linspace를 사용하면 연속적인 데이터를 쉽게 생성할 수 있습니다. 코드 성능은 동일하며, 상황에 따라 가독성을 고려해 선택하는 것이 좋습니다.

np.arange

  • N만큼 차이나는 숫자 생성
  • 끝 값은 포함하지 않음 (Python의 range()와 유사)
  • 구간과 간격을 강조할 때 유리
np.arange([start], stop, [step])

 

  • [start]와 [step]은 생략 가능
  • stop은 포함하지 않음

np.linspace

  • N등분한 숫자 생성
  • 처음 값과 끝 값을 포함
  • 개수 강조 시 사용하기 좋음
np.linspace(start, stop, num=50)

 

  • 기본적으로 50개의 숫자 생성

 

 

예시 코드

# 1부터 20 미만까지 2 간격으로 생성
print(np.arange(1, 20, 2))  # [1 3 5 7 9 11 13 15 17 19]

# 1부터 5까지 0.6 간격으로 생성
print(np.arange(1, 5, 0.6))  # [1.  1.6 2.2 2.8 3.4 4. ]

# 0부터 50까지 총 10등분한 값 생성
a = np.linspace(0, 50, 10)
print(a)  # [ 0.  5.5556 11.1111 ... 50.]

 

어떤 것을 사용해야 할까?

  • np.arange: 간격(step)을 강조하고 싶을 때 사용
  • np.linspace: 몇 등분(num)을 강조하고 싶을 때 사용

주의점

  • np.arange의 결과는 간격(step)에 따라 정확히 맞아떨어지지 않을 수 있습니다. (예: 부동소수점 연산 오차)
  • np.linspace는 시작과 끝 값을 포함하므로 구간의 끝이 정확해야 하는 경우 더 적합합니다.

 

Numpy 연산

numpy에서는 수치 연산이 기본적으로 element-wise 연산으로 수행됩니다.

Element-wise 연산이란?

  • Element-wise: 동일한 위치에 있는 배열 원소끼리 연산을 수행하는 방식입니다.
  • 축(axis)차원을 기준으로 같은 위치에 있는 원소끼리 연산됩니다.

 

예시 코드

import numpy as np

a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 3, 4, 5, 6])

c = b - a  # 배열의 동일 위치 원소끼리 뺄셈
d = b * a  # 배열의 동일 위치 원소끼리 곱셈

print(a)  # [1 2 3 4 5]
print(b)  # [2 3 4 5 6]
print(c)  # [1 1 1 1 1]
print(d)  # [ 2  6 12 20 30]

Boolean 연산

Numpy는 Boolean 연산도 지원합니다.

print(a < 3)  # [ True  True False False False ]

 

 

Numpy 여러 가지 곱셈 연산

  • *: 원소별 곱셈 (element-wise multiplication)
  • @: 행렬 곱셈 (matrix multiplication)
    • 주의: 2차원 이상의 배열에서 @선형대수의 행렬 곱을 수행합니다.

예시 코드

a = np.arange(1, 5).reshape(2, 2)  # [[1, 2], [3, 4]]
b = np.arange(2, 6).reshape(2, 2)  # [[2, 3], [4, 5]]

print(a * b)  # element-wise 곱셈 -> [[2, 6], [12, 20]]
print(a @ b)  # 행렬 곱셈 -> [[10, 13], [22, 29]]

 

 

Numpy 자동 형변환

  • Numpy 배열은 같은 데이터 타입만 저장할 수 있습니다.
  • 수치 연산 시 타입이 다르면 더 큰 범위의 타입으로 자동 변환됩니다.

타입 순서변환 방향

타입 순서 변환 방향
int < float < complex 작은 타입 → 큰 타입

예시 코드 (자동 형변환)

a = np.array([1, 2, 3], dtype=int)
b = np.array([1.5, 2.5, 3.5], dtype=float)

c = a + b  # int + float -> float로 자동 변환
print(c)  # [2.5 4.5 6.5]
print(c.dtype)  # float64

 

 

Numpy 집계 함수

Numpy에서는 여러 가지 집계 함수(aggregation function)를 제공합니다.

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

print(a.sum())      # 15
print(a.min())      # 1
print(a.max())      # 5
print(a.argmax())   # 4 (최댓값의 인덱스)
print(a.cumsum())   # [1 3 6 10 15] (누적합)

축(axis) 기준 집계

  • Numpy는 축(axis)를 기준으로 집계 연산을 수행할 수 있습니다.
    • axis=0: 열(column) 기준
    • axis=1: 행(row) 기준
a = np.array([[1, 2], [3, 4]])

print(a.sum(axis=0))  # [4 6] (열 기준 합)
print(a.sum(axis=1))  # [3 7] (행 기준 합)

 

 

Numpy의 범용 함수

Numpy는 다양한 범용 함수(universal function)를 제공합니다.

함수설명

함수 설명
add 두 배열의 원소별 덧셈
subtract 두 배열의 원소별 뺄셈
multiply 두 배열의 원소별 곱셈
divide 두 배열의 원소별 나눗셈
log 각 원소의 로그 값
sin, cos, tan 삼각 함수

예시 코드

a = np.array([0, np.pi / 2, np.pi])

print(np.sin(a))  # [0. 1. 0.]
print(np.log(np.array([1, np.e, np.e**2])))  # [0. 1. 2.]
728x90

'Python' 카테고리의 다른 글

[Python] Numpy 데이터 합치기, 쪼개기  (0) 2024.10.20
[Python] Numpy 인덱싱, 슬라이싱  (0) 2024.10.20
[Python] 리스트  (0) 2024.09.03
[Python] 함수  (0) 2024.08.27
[Python] 반복문  (0) 2024.08.27