Python/파이썬 라이브러리

[파이썬 라이브러리] Numpy

서노리 2022. 10. 22. 15:57
반응형

Numpy

  • Numerical Python의 약자로 숫자로 이루어진 배열을 다루기 위한 파이썬의 라이브러리
  • 파이썬의 list에 비해 규모가 큰 다차원 배열의 저장 및 처리에 훨씬 효율적
  • pandas 등 다양한 데이터 처리 라이브러리에서 사용됨

 

Numpy array의 생성

# numpy 사용하기
import numpy as np

# numpy를 이용하여 array 정의하기
arr = [1, 2, 3, 4, 5]
n_arr = np.array(arr)
print(n_arr) # [1 2 3 4 5]

 

Numpy array의 특징

  • Numpy 배열은 생성 이후 크기를 변경할 수 없음 => 변경이 있을 시 새로 생성해야 함
  • list보다 메모리 공간을 덜 차지함
  • Numpy 배열의 모든 요소는 같은 타입이어야 함
    - 타입이 일치하지 않을 경우 가능한 상위 타입을 취함

    - 정수 < 실수 < 문자열
import numpy as np

arr = ['3.14', 2., 3., 5]
n_arr = np.array(arr)
print(arr) # ['3.14', 2.0, 3.0, 5]
print(type(arr)) # <class 'list'>
print(n_arr) # ['3.14' '2.0' '3.0' '5']
print(type(n_arr)) # <class 'numpy.ndarray'>

위 코드에서 문자열, 실수, 정수가 섞인 list를 numpy array로 생성하니 모든 요소가 문자열 타입으로 자동 변경되었다.

명시적으로 데이터 타입을 지정하기 위해서는 dtype 속성을 사용한다.

import numpy as np

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

※ Numpy array의 표준 데이터 타입

 

Numpy array의 속성

  • n_arr.ndim
    - array의 차원의 수를 확인

  • n_arr.shape
    - array의 모양을 튜플 형태로 반환
n_arr = np.array([1, 2, 3, 4, 5])
n_arr2 = np.array([[1, 4, 2], [7, 5, 3]])
print(n_arr.shape) # (5,) => 1차원이며 크기5의 array
print(n_arr2.shape) # (2, 3) => 2차원이며 2행 3열 크기의 array
  • n_arr.size
    - array의 항목의 수

※ 2차원 Numpy array 배열의 값 접근

- 배열명[행, 열] 또는 배열명[행][열]

nums = np.array([[1, 4, 2], [7, 5, 3]])
print(nums[1, 1]) # 5
print(nums[1, :2]) # [7, 5]
print(nums[:, 2:]) # [[2] [3]]
print(nums[:, :2]) # [[1 4] [7 5]]

※ 다차원 배열의 슬라이싱의 경우 범위로 슬라이싱 할 때와 특정 행/열을 슬라이싱 할 때의 shape가 다름에 유의

nums = np.array([[1, 4, 2], [7, 5, 3]])
print(nums[0:1, ])  # [[1 4 2]]
print(nums[0:1, :])  # [[1 4 2]]
print(nums[0, :])  # [1 4 2]

 

※ Numpy array의 경우 배열에 대한 검색 / 슬라이싱 결과는 참조만 할당
즉, 기존 배열이 변경될 경우 값이 같이 변경된다. 따라서 독립적으로 사용해야할 경우 copy() 함수를 사용한다.

nums = np.array([1, 4, 2, 5, 3])
ref = nums[1:4]  # [4 2 5]
cpy = nums[1:4].copy()  # [4 2 5]

nums[2] = 7
print(ref)  # [4 7 5]
print(cpy)  # [4 2 5]

 

Numpy 내장 함수를 이용한 배열 생성

  • np.zeros(shape)
    - 모든 값이 0인 배열 생성

  • np.ones(shape)
    - 모든 값이 1인 배열 생성

  • np.full(shape, value)
    - 모든 값이 value로 초기화된 배열 생성

  • np.identity(size)
    - 크기가 size x size인 단위행렬 생성

  • np.eye(size, k=n)
    - 크기가 size x size인 단위행렬 생성 후 k만큼 이동

  • np.random.random(shape)
    - 0과 1 사이의 임의의 숫자로 초기화된 배열 생성

  • np.arange(start, stop, step, dtype=' ')
    - start부터 stop전까지 step 단위로 배열에 값을 생성

Numpy array의 형태 변형

  • reshape(shape)
    - 기존 배열을 shape 형태로 변형
    - 단, 기존 배열과 새로운 배열의 요소 수는 동일해야함

  • n_arr.T
    - 기존 행렬의 전치행렬(행과 열이 뒤바뀐 행렬) 반환
    - 함수가 아닌 속성

  • swapaxes(axis1, axis2)
    - 축1과 축2를 서로 맞바꿈
    - n_arr.swapaxes(0, 1) == n_arr.T

  • transpose(shape)
    - 변형 후 축의 index를 순서대로 기재
    - 한 번에 여러 개의 축을 바꿀 수 있음

Numpy array의 병합

  • concatenate([array1, array2, ...], axis=n)
    - 해당 axis 방향으로 array를 순서대로 연결
    - axis의 default 값은 0(수직 방향)

  • vstack([array1, array2, ...])
    - 수직 방향으로 array 순서대로 연결

  • hstack([array1, array2, ...])
    - 수평 방향으로 array 순서대로 연결

 

Numpy array의 분할

  • split(array, 분할 지점의 리스트)
    - 분할 지점의 리스트를 기준으로 array를 분할
x = np.arange(10)
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3) # [0 1 2] [3 4] [5 6 7 8 9]
# 2차원 배열의 분할
x = np.arange(16).reshape((4, 4))
upper, lower = np.split(x, [2], axis=0)
print(upper)
print(lower)

# [[0 1 2 3]
#  [4 5 6 7]]
# [[ 8  9 10 11]
#  [12 13 14 15]]
  • vsplit(), hsplit()
    - 각각 수직방향, 수평방향으로 분할

 

Numpy의 연산

Numpy 배열의 연산에서는 연산 대상인 두 배열들의 차원이 같은 경우 각 요소 단위로 연산을 수행한다.

a = np.array([0, 1, 2])
b = np.array([5, 5, 5])
print(a + b) # [5 6 7]

브로드캐스팅(Broadcasting)

브로드캐스팅이란 연산 대상 둘 중 하나가 스칼라 값인 경우 배열로 확장 혹은 복제 후 처리하는 것이다.

a = np.array([0, 1, 2])
b = 5
print(a + b) # [5 6 7]

※ 브로드캐스팅 규칙

  1. 두 배열의 차원 수가 다르면 더 작은 수의 차원을 가진 배열의 shape 앞에 1을 추가하여 두 배열의 차원을 같게 만듬
  2. 두 배열 중 한 배열의 차원이 1인 배열은 다른 배열의 shape와 일치하도록 늘어남
  3. 1번 2번 규칙을 모두 적용한 뒤에도 shape이 서로 다르면 브로드캐스팅에 실패

첫 번째 그림에서 (3, ) 짜리 배열과 (1, ) 짜리 배열의 연산에서 2번 규칙에 따라 (1, )이 (3, )으로 늘어난 뒤 연산이 수행된다. 두 번째 그림에서는 1번 규칙에 따라 (3, ) 배열이 (1, 3) 배열이 된 후 2번 규칙에 따라 (3, 3) 으로 늘어난 뒤 연산이 수행된다. 세 번째 그림에서는 1번 규칙에 따라 (3, )짜리 배열이 (1, 3) 배열이 된 후 2번 규칙에 따라 (3, 1) 배열과 (1, 3) 배열 모두 (3, 3)로 늘어난 뒤 연산이 수행된다. 


 

반응형