Numpy

오상윤·2023년 2월 11일
0

EDA

목록 보기
2/16

Numpy(수치 계산 라이브러리)

  • Numerical Python의 약자로 대표적인 파이썬 기반 수치 해석 라이브러리
  • 선형대수 연산에 필요한 다차원 배열과 배열 연산을 수행하는 다양한 함수 제공
# numpy 패키지 로드하여 np로 사용
import numpy as np

Numpy 배열

  • numpy에서 배열은 ndarray 또는 array 부름
  • numpy.array와 python.array는 다름
    • numpy array는 numpy array끼리 연산이 가능하지만 python list는 덧셈만 가능
      • numpy array : [10, 5, 3, 7, 1, 5] + [10, 5, 3, 7, 1, 5] = [20, 10, 6, 14, 2, 10]
      • python list : [10, 5, 3, 7, 1, 5] + [10, 5, 3, 7, 1, 5] = [10, 5, 3, 7, 1, 5, 10, 5, 3, 7, 1, 5]
    • numpy array는 array 전체에 연산이 가능하지만 Python list는 곱셈(list 요소 반복)만 가능
      • numpy array : [10, 5, 3, 7, 1, 5] + 5 = [15, 10, 8, 12, 6, 10]
      • pyhon list : [10, 5, 3, 7, 1, 5] * 2 = [10, 5, 3, 7, 1, 5, 10, 5, 3, 7, 1, 5]
        numpy array가 python list에 비해 문법이 간단하고 성능이 뛰어나다
  • numpy는 모든 배열의 값이 기본적으로 같은 타입
  • numpy에서 각 차원(Dimension)을 축(axis)이라고 표현

배열 예제

# 2개의 축을 가지며 첫 번째 축은 길이가 2이고 두 번째 축은 길이가 3이다.
[[1, 0, 0],
 [0, 1, 2]]
# 1개의 축을 가지며 축은 3가지 요소(element)를 가지고 있으며 길이(length)는 3이다
[1, 2, 1]

Numpy 배열 대표 속성값

  • ndarray.shape : 배열의 각 축(axis)의 크기
  • ndarray.ndim : 축의 개수(Dimension)
  • ndarray.dtype : 각 요소(Element)의 타입
  • ndarray.itemsize : 각 요소(Element)의 타입의 bytes 크기
  • ndarray.size : 전체 요소(Element)의 개수
# a라는 변수에 (3, 4) 크기의 2D 배열을 생성
a = np.arange(12).reshape(3, 4)
print(a)

shape

# ndarray.shape : 배열의 각 축(axis)의 크기
print(a.shape)

dtype

# ndarray.dtype : 각 요소(Element)의 타입
print(a.dtype)

itemsize

# ndarray.itemsize : 각 요소(Element)의 타입의 bytes 크기
print(a.itemsize)

size

# ndarray.size : 전체 요소(Element)의 개수
print(a.size)

Numpy 배열 생성

  • np.array를 이용하여 Python에서 사용하는 Tuple(튜플)이나 List(리스트)를 입력으로 numpy.ndarray를 생성
  • np.zeros, np.ones, np.empty를 이용ㄹ하여 다양한 차원의 데이터를 쉽게 생성 가능
    • np.zeros(shape) : 0으로 구성된 N차원 배열 생성
    • np.ones(shape) : 1로 구성된 N차원 배열 생성
    • np.empty(shape) : 초기화되지 않은 N차원 배열 생성

np.zeros

# np.zeros(shape) : 0으로 구성된 N차원 배열 생성
print(np.zeros((3,4)))

np.ones

# np.ones(shape) : 1로 구성된 N차원 배열 생성
print(np.ones((2,3,4), dtype=np.int64))

np.empty

# np.empty(shape) : 초기화되지 않은 N차원 배열 생성
print(np.empty((2,3)))

arrange와 linspace 데이터 생성, 배열 출력

  • np.arrange와 np.linspace를 이용하여 연속적인 데이터를 쉽게 생성 가능
    • np.arrange : N 만큼 차이나는 숫자 생성
    • np.linspace : N 등분한 숫자 생성
  • np.arrange와 np.linspace의 차이점
    • np.arrange([start], stop, [step]..)
      • []생략 가능, 끝 값 포함 안함
      • 장점 : step, 범위를 구간, 간격 강조할 때 사용하면 코드 가독성 높아짐
    • np.linspace(start, stop, num-50..)
      • 처음 값과 끝 값 포함, 몇 개로 만들지 매개변수로 줌
      • 장점 : 개수 강조할 때 사용하면 코드 가독성 높아짐

np.arange

# 10이상 30미만까지 5씩 차이나게 생성
print(np.arange(10, 30, 5))
# 0이상 2미만까지 0.3씩 차이나게 생성
print(np.arange(0, 2, 0.3))

np.linspace

# 0~99까지 100등분
x = np.linspace(0, 99, 100)
print(x)

Numpy 배열 출력

  • 1D와 2D 배열은 설명하지 않아도 어떻게 출력되는지 확인할 수 있음
  • 3D 배열은 2차원이 N개 출력되는 형식으로 나타남

1차원

# 1차원 배열 출력
a = np.arange(6)
print(a)

2차원

# 2차원 배열 출력
b = np.arange(12).reshape(4,3)
print(b)

3차원

# 3차원 배열 출력
# (3,4)크기의 2차원 배열이 2개 출력되는 형식
c = np.arange(24).reshape(2,3,4)
print(c)

기본 연상 및 범용 함수

NumPy 기본 연산

  • numpy에서 수치 연산은 기본적으로 element wise 연산
    • 차원(축)을 기준으로 행렬 내에서 같은 위치에 있는 원소끼리 연산을 하는 방식
  • numpy 여러가지 곱셈 존재
    • * : 각각의 원소끼리 곱셈(Elementwise product, Hadamard product)
    • @ : 행렬 곱셈 (Matrix product)
# a와 b 배열 생성하여 출력
a = np.array([20, 30, 40, 50])
b = np.arange(4)
print(a)
print(b)
# a에서 b에 각각의 원소를 - 연산
c = a - b
print(c)
# b 각각의 원소에 제곱 연산
print(b**2)
# a 각각의 원소에 *10 연산
print(10*a)
# a 각각의 원소가 35보다 작은지 Boolean 결과
print(a < 35)
# A와 B 배열 생성하여 출력
A = np.array( [[1,1],
               [0,1]])
B = np.array( [[2,0],
               [3,4]])
print(A)
print(B)
# A * B
# 각각의 원소끼리 곱셈
print(A * B)
# A @ B
# 행렬 곱셈 사용
print(A @ B)
  • numpy 자동 형 변환
    • 수치 연산을 진행할 때 각각의 .dtype이 다르면 타입이 큰쪽 (int < float < complex)으로 자동으로 변경
# a와 b 배열 생성 & 타입 확인
a = np.ones(3, dtype=np.int32)
b = np.linspace(0, np.pi, 3)
print(a)
print(b)
print(a.dtype)
print(b.dtype)
# a(int), b(float) 연산 시 float로 upcasting
c = a + b
print(c)
print(c.dtype)
# 마찬가지로 복소수 연산 시 complex(복소수)로 upcasting
# exp 함수는 지수 함수
d = np.exp(c*1j)
print(d)
print(d.dtype)

numpy 집계함수

  • .sum : 모든 요소의 합
  • .min : 모든 요소 중 최소값
  • .max : 모든 요소 중 최대 값
  • .argmax : 모든 요소 중 최대값의 인덳
  • .cumsum : 모든 요소의 누적합
# a 배열 생성 & 출력
# 0부터 8미만까지 출력하고 (2,4) 크기로 재가공하고 제곱하여 출력
a = np.arange(8).reshape(2,4)**2
print(a)

sum

# 모든 요소의 합
print(a)
print(a.sum())

min

# 모든 요소 중 최소값
print(a.min())

max

# 모든 요소 중 최대값
print(a.max())

argmax

# 모든 요소 중 최대값의 인덱스
print(a)
print(a.argmax())

cumsum

# 모든 요소의 누적합
# 14 = 0 + 1 + 4 + 9
print(a)
print(a.cumsum())

axis

  • numpy 집계함수 axis 값을 매개변수로 입력
    • 축을 기준으로 연산 가능
    • axis = 0 (열 기준)
    • axis = 1 (행 기준)
# b 배열 생성 & 출력
b = np.arange(12).reshape(3, 4)
# axis = 0은 열 기준으로 연산
print(b.sum(axis=0))
# axis = 1은 행 기준으로 연산
print(b.sum(axis=1))

인덱싱과 슬라이싱 및 크기 변경

Numpy 인덱싱과 슬라이싱

  • numpy 인덱싱(indexing, 가리킴)과 슬라이싱(slicing, 잘라냄)
    • 각각 문자열에서 한 개 또는 여러 개를 가리켜서 그 값을 가져오거나 뽑아내는 방법
  • numpy 인덱스 배열로 인덱싱
    • 인덱스를 가진 배열로 인덱싱 진행
# a 배열 생성 & 출력
a = np.arange(10)**2
print(a)
# a 배열의 2번째 인덱스 출력
print(a[2])
# a 배열의 2~4번 인덱스 출력
print(a[2:5])
# reverse : 배열의 요소 거꾸로 출력
print(a[ : :-1])
# 0~5번에서 2Step 인덱스 출력
# a[0:6:2] = a[:6:2]
# 인덱스 0, 2, 4 해당하는 값에 1000 삽입
a[0:6:2] = 1000  
print(a)
# a 배열 생성 & 출력
a = np.arange(8)**2
# i : 1차원 배열 생성 & 출력
# a 배열의 index로 i를 삽입하여 출력
i = np.array([1, 1, 3, 5])
print(a[i])
# j 2차원 배열 생성
# a 배열의 index로 j를 삽입하여 출력
j = np.array([[3,4], [2,5]])
print(a[j])

numpy boolean 인덱싱

  • boolean 타입을 가진 값들로 인덱싱 진행
# a 배열 생성 & 출력
a = np.arange(12).reshape(3,4)
# b는 a > 4 조건이 적용된 Boolean 값이 든 배열
b = a > 4
# Boolean 값이 든 b 배열을 a 배열의 index로 삽입
# True인 값들만 출력
print(a[b])
a[b].shape
# a[b]에 해당하는 애들만 0 삽입하여 a 출력
a[b] = 0
print(a)

numpy 크기 변경

  • np.ndarray의 shape를 다양한 방법으로 변경 간으
    • .ravel : 1차원으로 변경
    • .reshape : 지정한 차원으로 변경
    • .T : 전치(Transpose) 변환
# a 배열 생성 & shape 출력
a = np.arange(12).reshape(3, 4)

ravel

# .ravel : 모든 원소를 1차원으로 변경
print(a.ravel())
print(a.reshape(-1))

reshape

# .reshape : 지정한 차원으로 변경
# [3,4] => [2,6]로 변경
print(a.reshape(2,6))

T

# .T : [3,4]의 전치(Transpose)변환으로 [4,3] 출력
print(a.T)
print(a.T.shape)

데이터 합치기, 쪼개기

numpy 데이터 합치기

  • np.vstack와 np.hstack을 통해 데이터 합치기
    • np.vstack : axis=0(열)기준으로 쌓음
    • np.hstack : axis=1(행)기준으로 쌓음
# a 배열 생성 & 출력
a = np.array([1, 2, 3, 4]).reshape(2, 2)
# b 배열 생성 & 출력
b = np.array([5, 6, 7, 8]).reshape(2, 2)

vstack

# [2,2] => [4,2]
# np.vstack() : aixs=0(열) 기준으로 쌓음
print(np.vstack((a,b)))

hstack

# [2,2] => [2,4]
# np.hstack() : axis=1(행) 기준으로 샇음
print(np.hstack((a,b)))

numpy 데이터 쪼개기

  • np.hsplit을 통해 숫자 1개가 들어갈 경우, X개로 등분
  • np.hsplit을 통해 리스트로 넣을 경우, axis=1(행) 기준 인덱스로 데이터를 분할
# a 배열 생성 & 출력
a = np.arange(12).reshape(2, 6)

hsplit

# [2,6] => [2,2] 데이터 3개로 등분
print(np.hsplit(a, 3))
# [2,6] => [:, :3], [:, 3:4], [:, 4:]로 분할
# a를 3번째 열 ~ 4번째 열 미만 기준으로 분할하여 3개의 array를 반환
print(np.hsplit(a, (3,4)))
profile
가보자가보자~

0개의 댓글