Numpy Cheatsheet#

Numpy는 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리 할 수 있도록 지원하는 파이썬 라이브러리입니다. NumPy는 데이터 구조 외에도 수치 계산을 위해 효율적으로 구현된 기능을 제공합니다.

참조

import numpy as np
import matplotlib.pyplot as plt

print("numpy ver={}".format(np.__version__))
numpy ver=1.23.1

Array#

생성#

단일 데이터 타입만 허용

# 1차원 배열 생성 - int, float 혼용시 float
data = [1, 2, 3.1, 4.1]
arr = np.array(data)
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

# Int 형 2차원 배열 생성
data = [[1, 2], [3.1, 4.1]]
arr = np.array(data, dtype=int)
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

# Int 형 3차원 배열 생성
data = [[[1, 2], [3, 4]], [[1, 2], [3, 4]]]
arr = np.array(data, dtype=int)
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")
arr=[1.  2.  3.1 4.1]
dtype=float64, shape=(4,)

arr=[[1 2]
 [3 4]]
dtype=int64, shape=(2, 2)

arr=[[[1 2]
  [3 4]]

 [[1 2]
  [3 4]]]
dtype=int64, shape=(2, 2, 2)
# 초기화된 array 생성
arr = np.zeros(4)
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = np.zeros_like(arr) # 기존 array 형태를 유지한채 초기화
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = np.arange(4) # python range 와 유사
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = np.arange(start=1, stop=10, step=3, dtype=float) # python range 와 유사
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = np.ones((2, 2))
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = np.ones_like(arr)
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = np.empty((2, 2, 2))
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = np.empty_like(arr)
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")
arr=[0. 0. 0. 0.]
dtype=float64, shape=(4,)

arr=[0. 0. 0. 0.]
dtype=float64, shape=(4,)

arr=[0 1 2 3]
dtype=int64, shape=(4,)

arr=[1. 4. 7.]
dtype=float64, shape=(3,)

arr=[[1. 1.]
 [1. 1.]]
dtype=float64, shape=(2, 2)

arr=[[1. 1.]
 [1. 1.]]
dtype=float64, shape=(2, 2)

arr=[[[4.9e-324 9.9e-324]
  [1.5e-323 2.0e-323]]

 [[4.9e-324 9.9e-324]
  [1.5e-323 2.0e-323]]]
dtype=float64, shape=(2, 2, 2)

arr=[[[4.9e-324 9.9e-324]
  [1.5e-323 2.0e-323]]

 [[4.9e-324 9.9e-324]
  [1.5e-323 2.0e-323]]]
dtype=float64, shape=(2, 2, 2)
# reshape: array의 형태를 변경
arr = arr.reshape(arr.size)
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

arr = arr.reshape((2, -1)) # -1 값을 넣으면 자동으로 계산
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}\n")

# asarray: array 를 복사하지 않고 생성
arr1 = np.asarray(arr)
print(f"arr1 == arr?: {arr1 is arr}")
arr=[4.9e-324 9.9e-324 1.5e-323 2.0e-323 4.9e-324 9.9e-324 1.5e-323 2.0e-323]
dtype=float64, shape=(8,)

arr=[[4.9e-324 9.9e-324 1.5e-323 2.0e-323]
 [4.9e-324 9.9e-324 1.5e-323 2.0e-323]]
dtype=float64, shape=(2, 4)

arr1 == arr?: True

인덱싱 및 슬라이싱#

# 1차원 array 
arr = np.arange(5) # python range 와 유사
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
print(f"arr[0]={arr[0]}, arr[-1]={arr[-1]}")
print(f"arr[:3]={arr[:3]}, arr[7:]={arr[3:]}") # 범위 인덱싱
print(f"arr[[1, 3]]={arr[[1, 3]]}") # Fancy 인덱싱: 특정 인덱스의 집합의 값을 선택하여 추출
print(f"arr[[False, True, True, True, True]]={arr[[False, True, True, True, True]]}") # Boolean 인덱싱: 조건 값이 True 인 값들만 선택하여 추출
print()

# 2차원 array: arr2d[행, 열]
arr = np.arange(15).reshape((3, -1)) # python range 와 유사
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
print(f"arr[0, 1]={arr[0, 1]}, arr[1, -1]={arr[1, -1]}")
print(f"arr[0, :3]={arr[0, :3]}, arr[-1, :]={arr[-1, :]}") # 범위
print(f"arr[:, :]={arr[:, :]}") # 범위
print(f"arr[[1, 1], [1, -1]]={arr[[1, 1], [1, -1]]}") # Fancy 인덱싱: 특정 인덱스의 집합의 값을 선택하여 추출
print(f"arr > 2={arr > 2}, arr[arr > 2]]={arr[arr > 2]}") # Boolean 인덱싱: 조건 값이 True 인 값들만 선택하여 추출
arr=[0 1 2 3 4]
dtype=int64, shape=(5,)
arr[0]=0, arr[-1]=4
arr[:3]=[0 1 2], arr[7:]=[3 4]
arr[[1, 3]]=[1 3]
arr[[False, True, True, True, True]]=[1 2 3 4]

arr=[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
dtype=int64, shape=(3, 5)
arr[0, 1]=1, arr[1, -1]=9
arr[0, :3]=[0 1 2], arr[-1, :]=[10 11 12 13 14]
arr[:, :]=[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
arr[[1, 1], [1, -1]]=[6 9]
arr > 2=[[False False False  True  True]
 [ True  True  True  True  True]
 [ True  True  True  True  True]], arr[arr > 2]]=[ 3  4  5  6  7  8  9 10 11 12 13 14]

정렬#

# 1차원
arr = np.arange(10)
arr = np.sort(arr) # 오름차순
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
arr = np.sort(arr)[::-1] # 내림차순
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
print()

# N차원
# Int 형 3차원 배열 생성
arr = np.arange(15).reshape((3, -1))
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
arr = np.sort(arr, axis=0) # 오름차순: Column 기준
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
arr = np.sort(arr, axis=1)[::-1] # 내림차순: Row 기준 
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
arr=[0 1 2 3 4 5 6 7 8 9]
dtype=int64, shape=(10,)
arr=[9 8 7 6 5 4 3 2 1 0]
dtype=int64, shape=(10,)

arr=[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
dtype=int64, shape=(3, 5)
arr=[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
dtype=int64, shape=(3, 5)
arr=[[10 11 12 13 14]
 [ 5  6  7  8  9]
 [ 0  1  2  3  4]]
dtype=int64, shape=(3, 5)
# N차원: 정렬 인덱스 출력
# Int 형 3차원 배열 생성
arr = np.arange(15).reshape((3, -1))
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
arr = np.argsort(arr, axis=0) # 오름차순: Column 기준
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
arr = np.argsort(arr, axis=1)[::-1] # 내림차순: Row 기준 
print(f"arr={arr}\ndtype={arr.dtype}, shape={arr.shape}")
arr=[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
dtype=int64, shape=(3, 5)
arr=[[0 0 0 0 0]
 [1 1 1 1 1]
 [2 2 2 2 2]]
dtype=int64, shape=(3, 5)
arr=[[0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]]
dtype=int64, shape=(3, 5)

행렬 연산#

# 행렬 덧셈, 뺄셈
a = np.arange(10).reshape((2, -1))
b = np.arange(10).reshape((2, -1))
print(f"a={a}\nb={b}")
print(f"a+b={a+b}")
print(f"a-b={a-b}")
print(f"column sum={np.sum(a, axis=0)}")
print(f"row sum={np.sum(a, axis=1)}")
a=[[0 1 2 3 4]
 [5 6 7 8 9]]
b=[[0 1 2 3 4]
 [5 6 7 8 9]]
a+b=[[ 0  2  4  6  8]
 [10 12 14 16 18]]
a-b=[[0 0 0 0 0]
 [0 0 0 0 0]]
column sum=[ 5  7  9 11 13]
row sum=[10 35]
# 행렬 곱셈, 나눗셈
a = np.arange(1, 11).reshape((2, -1))
b = np.arange(1, 11).reshape((2, -1))
print(f"a={a}\nb={b}")
print(f"a*b={a*b}")
print(f"a/b={a/b}")
a=[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
b=[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
a*b=[[  1   4   9  16  25]
 [ 36  49  64  81 100]]
a/b=[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
# 행렬 내적
a = np.arange(1, 11).reshape((2, -1))
b = np.arange(1, 11).reshape((-1, 2))
print(f"a={a}\nb={b}")
print(f"a.b={np.dot(a, b)}")
a=[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
b=[[ 1  2]
 [ 3  4]
 [ 5  6]
 [ 7  8]
 [ 9 10]]
a.b=[[ 95 110]
 [220 260]]
# Broadcasting: 행렬 연산시 Shape 이 다른 행렬도 조건이 맞을 경우 연산 가능
# https://numpy.org/doc/stable/user/basics.broadcasting.html
a = np.arange(9).reshape((3, -1))

# 행렬 + 상수
print(f"a+3={a+3}")
print(f"a-3={a-3}")
print(f"a*3={a*3}")
print(f"a/3={a/3}")
print()

# 행렬 + 행렬: 맴버가 하나인 배열, ex) 3x3 + 1 = 3x3
b = [1]
print(f"a+b={a+b}")

# 행렬 + 행렬: 하나의 배열의 차원이 1인 경우, ex) 3x3 + 1x3 = 3x3
b = [1, 1, 1]
print(f"a+b={a+b}")

# 행렬 + 행렬: 차원의 짝이 맞을 때, ex) 3x1 + 1x3 = 3x3
a = np.arange(3).reshape((3, -1))
b = np.ones((1, 3))
print(f"a+b={a+b}")
a+3=[[ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
a-3=[[-3 -2 -1]
 [ 0  1  2]
 [ 3  4  5]]
a*3=[[ 0  3  6]
 [ 9 12 15]
 [18 21 24]]
a/3=[[0.         0.33333333 0.66666667]
 [1.         1.33333333 1.66666667]
 [2.         2.33333333 2.66666667]]

a+b=[[1 2 3]
 [4 5 6]
 [7 8 9]]
a+b=[[1 2 3]
 [4 5 6]
 [7 8 9]]
a+b=[[1. 1. 1.]
 [2. 2. 2.]
 [3. 3. 3.]]