Python/Numpy

[Numpy] Numpy Functions

데이터 세상 2021. 3. 5. 01:01
728x90
반응형

ufunc (Universal Function)

  • ndarray 안에 있는 데이터 원소 별로 연산을 수행하는 함수
  • 하나 이상의 스칼라 값을 받아서 하나 이상의 스칼라 결과 값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 벡터화된 래퍼 함수
연산 함수
사칙연산 add(), multiply(), negative(), exp(), log(), sqrt()
삼각 함수 sin(), cos(), hypot()
비트 단위 bitwise_and(), left_shift()
관계형, 논리 less(), logical_not(), equal()
최대/최소 maximum(), minimum(), modf()
부동소수점에 적용 함수 isinf(), infinite(), floor(), isnan()

 

단항 유니버셜 함수

함수 설명
abs, fabs 각 원소의 절대값. 복소수가 아닌 경우 fabs를 쓰면 빠른 연산이 가능
sqrt 각 원소의 제곱근 계산 (arr**0.5)
square 각 원소의 제곱율 계산 (arr**2)
exp 각 원소의 지수 e^x 계산
log, log10, log2, log1p 자연로그, 밑 10인 로그, 밑 2인 록, log(1+x)
sign 각 원소의 부호 (양수 1, 0, 음수 -1)
ceil 각 원소의 값보다 같거나 큰 정수 중 가장 작은 값
floor 각 원소의  값보가 같거나 작은 정수 중 가장 큰 값
rint 각 원소의 소수자리를 반올림
modf 각 원소의 몫과 나머지를 각각의 배열로 반환
isnan 각 원소가 NaN인지 아닌지 불리언 배열로 반환
isfinite, isinf 각 원소가 유한한지 무한한지 불리언 배열로 반환
cos, cosh, sin, sinh, tan, tanh 일반 삼각함수, 쌍곡삼각함수
arccos, arccosh, arcsin, arcsinh, arctan, artanh 역삼각함수

 

이항 유니버셜 함수

함수   설명
add + 두 배열의 같은 위치의 원소끼리 더하기
subtract - 첫 번째 배열의 원소에서 두 번째 배열의 원소를 뺌
multiply * 같은 위치의 원소끼리 곱하기
divide, floor_divide /, // 첫 번째 배열의 원소를 두 번재 배열의 원소로 나눔. floor는 몫만 취함
power ** 첫 번째 배열의 원소를 두 번째 배열의 원소만큼 제곱함
maximum, fmax   각 배열의 두 원소 중 큰 값을 반환. fmax는 NaN 무시
minimum, fmin   각 배열의 원소 중 작은 값을 반환. fmin는 NaN 무시
mod % 첫 번째 배열의 원소를 두 번째 배열의 원소로 나눈 나머지
copysign   첫 번째 배열의 원소의 기호를 두 번째 배열의 원소의 기호로 바꿈
greater, greater_equal, less, less_equal   각 두 원소 간의 비교 연산(<, <=, >, >=, ==, !=)를 불리언 배열로 반환

 

where 함수

  • np.where(조건, x, y): 'x if 조건 else y' 같은 삼학식의 벡터화 버전
  • numpy를 사용하여 큰 배열을 빠르게 처리 가능하며, 다차원 배열도 간경하게 표현 가능
  • 임의로 생성된 데이터의 특정 값을 원하는 값으로 바꿀 수 있다
arr = np.random.randn(4, 4)
arr
>>
array([[-0.94055232, -1.00650323, -1.18096948, -1.83203106],
       [-0.47103769, -2.53258752,  0.16705334, -1.84778239],
       [-0.04325452,  0.33106234,  0.83938198,  0.95471975],
       [ 1.33032793, -1.33230257, -1.46370295,  0.02788888]])
       
       
np.where(arr > 0, 2, -2)
>>
array([[ 2, -2,  2, -2],
       [ 2,  2, -2,  2],
       [ 2, -2,  2,  2],
       [-2, -2, -2,  2]])
       

 

any(), all()

  • any(): 하나 이상의 값이 True이면 True 반환
  • all(): 모든 값이 True이면 True 반환
import numpy as np

xarr = np.array([1.1,1.2,1.3,1.4,1.5])
yarr = np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True, False, True, True, False])

result = [(x if c else y) for x,y,c in zip(xarr, yarr, cond)]
print('result:', result)

result2 = np.where(cond, xarr, yarr)
print('result2:', result2)

>>
result: [1.1, 2.2, 1.3, 1.4, 2.5]
result2: [1.1 2.2 1.3 1.4 2.5]

 

수학 및 통계 메서드(Aggregate Function)

  • 배열 전체 혹은 배열에서 한 축을 따르는 자료에 대한 통계를 계산하는 함수
  • sum, mean 등의 함수는 axis를 인자로 받아서 해당 axis에 대한 통계를 계산 가능
  • 축을 지정하지 않을 경우 배열 전체 대한 값을 연산
  • 2차원 배열 기준
    • axis=None: 전체 배열을 하나의 배열로 간주하고 집계 함수의 범위를 전체 행렬로 정의
    • axis=0: 행을 기준으로 각 행의 동일 인덱스의 요소를 그룹으로 하고 이를 집계 함수의 범위로 정의
    • axis=1: 열을 기준으로 각 열의 요소를 그룹으로 하고 이를 집계 함수의 범위로 정의
함수 설명
sum(), mean() 배열 전체 합, 평균
cumsum(), cumprod() 누적 합, 누적 곱
std(), var() 표준편차, 분산
min(), max() 최소값, 최대값
argmin(), argmax() 최소 원소의 색인 값, 최대 원소의 색인 값

 

import numpy as np 

arr = np.random.randn(200, 500)
arr.shape
>>
(200, 500)

arr.sum()
np.sum(arr)
>>
371.4563054971811

arr.mean(axis=0).shape
>> (500,)

arr.mean(axis=1).shape
>> (200,)

 

불리언 배열을 위한 메서드

  • numpy는 불리언 값을 이용한 배열의 값을 선택하고 처리할 수 있는 함수를 제공
  • any, all 메서드는 불리언 배열에 사용할 때 유용
  • any 메서드는 하나 이상의 True 값이 있는지 검사하고, all 메서드는 모든 원소가 True인지 검사할 때 사용
arr = np.random.randn(100)
(arr > 0).sum()

 

정렬

arr.sort()

  • 파이썬의 내장 리스트형처럼 numpy에서도 sort 메서드를 이용하여 정렬 가능
  • 주어진 축에 따라 정렬하며, 다양한 정렬방법들을 지원
  • arr 자체를 정렬함(in-place)
np.random.seed(10)
arr = np.random.randint(1, 100, size=10)
arr
>> array([10, 16, 65, 29, 90, 94, 30,  9, 74,  1])


arr.sort()
arr
>> array([ 1,  9, 10, 16, 29, 30, 65, 74, 90, 94])

 

import numpy as np
arr = np.random.randn(3, 3)
arr
>>
array([[ 2.30765072, -0.1339542 , -0.14067305],
       [ 1.22580775,  2.02457619, -0.02324537],
       [-1.29122669,  0.84210548, -2.05418146]])
       
       
arr.sort(axis = 1)
arr
>>
array([[-0.14067305, -0.1339542 ,  2.30765072],
       [-0.02324537,  1.22580775,  2.02457619],
       [-2.05418146, -1.29122669,  0.84210548]])
       
       
arr.sort(axis = 0)
arr
>>
array([[-2.05418146, -1.29122669,  0.84210548],
       [-0.14067305, -0.1339542 ,  2.02457619],
       [-0.02324537,  1.22580775,  2.30765072]])

 

np.sort(arr, axis=-1)

  • np.sort는 배열을 직접 변경하지 않고 정렬된 결과를 가진 복사본을 반환
np.random.seed(20)
arr = np.random.randint(1, 100, size=10)
arr
>> 
array([91, 16, 96, 29, 91, 10, 21, 76, 23, 72])

np.sort(arr)
>> 
array([10, 16, 21, 23, 29, 72, 76, 91, 91, 96])

-np.sort(-arr)
>>
array([96, 91, 91, 76, 72, 29, 23, 21, 16, 10])

 

집합 함수

1차원 ndarray를 위한 집합 연산을 제공

함수 설명
unique(x) 배열 x에서 중복된 원소를 제거한 후 정렬하여 반환
intersect1d(x, y) 배열 x와 y에 공통적으로 존재하는 원소를 정렬하여 반환
union1d(x, y) 두 배열의 합집합을 반환
in1d(x, y) x의 원소 중 y의 원소를 포함하는지를 나타내는 불리언 배열을 반환
setdiff1d(x, y) x와 y의 차집합을 반환
setxor1d(x, y) 한 배열에는 포함되지만 두 배열 모두에는 포함되지 않는 원소들의 집합인 대칭차집합을 반환

 

선형대수

  • 행렬의 곱셈, 분할, 행렬식과 같은 선형 대수에 관한 함수 제공
함수
설명
numpy.dot(a, b) 행렬 곱셈. 벡터의 내적
numpy.diag 정사각 행렬의 대각/비대각 원소를 1차원 배열로 반환하거나,
1차원 배열을 대각선 원소로 하고 나머지는 0으로 채운 단위 행렬을 반환
numpy.trace 행렬의 대각선 원소의 합을 계산
numpy.linalg.det 행렬식을 계산(ad-bc)
numpy.linalg.eig 정사각 행렬의 고유 값과 고유 벡터를 계산
numpy.linalg.inv 정사각 행렬의 역행렬을 계산
numpy.linalg.solve A가 정사각 행렬일 때 Ax = b를 만족하는 x를 구함
numpy.linalg.lstsq y = xb를 만족하는 최소제곱해를 구함
numpy.linalg.svd 특이값 분해(SVD)를 계산

 

np.dot(a, b)

  • 2개의 2차원 배열을 * 연산자로 곱하는 건 행렬 곱셈이 아니라 대응하는 각 원소의 곱을 계산하는 것
  • 행렬 곱셈은 배열 method이자 numpy 네임스페이스 안에 있는 함수인 dot 함수를 사용해서 계산
  • array@array
  • 행렬곱 수행 시, 앞의 배열에 대하여 열의 길이가 뒤의 배열에 대하여 행의 길이와 같지 않으면 오류 발생

import numpy as np

x = np.array([[1,2,3],[4,5,6]])
y = np.array([[6,23],[1,-7],[8,9]])
print(x.dot(y))

>>
[[ 32  36]
 [ 77 111]]

 

np.matmul(a, b)

  • matrix multiplication. 행렬의 곱
  • matmul을 수행할 시 shape를 유의
  • shape가 맞지 않는 경우 ValueError 발생
  • 3차원 이상의 경우 마지막 2개의 축으로 이루어진 행렬을 다른 축들에 따라 쌓은 것으로 파악
  • 마지막 2개의 차원이 행렬곱이 가능하다면 matmul 가능

 

a = np.random.randint(-3, 3, 10).reshape(2, 5)
b = np.random.randint(0, 5, 15).reshape(5, 3)
a.shape, b.shape
>>
((2, 5), (5, 3))

ab = np.matmul(a, b)
print(ab.shape)
print(ab)
>>
(2, 3)
[[ -3 -15 -15]
 [ -9  -6   1]]

 

a = np.arange(24).reshape(2, 3, 4)
b = np.arange(2*4*5).reshape(2, 4, 5)
a
>>
array([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],
 
        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])
b
>>
array([[[ 0,  1,  2,  3,  4],
         [ 5,  6,  7,  8,  9],
         [10, 11, 12, 13, 14],
         [15, 16, 17, 18, 19]],
 
        [[20, 21, 22, 23, 24],
         [25, 26, 27, 28, 29],
         [30, 31, 32, 33, 34],
         [35, 36, 37, 38, 39]]])
         
a.shape, b.shape
>>
((2, 3, 4), (2, 4, 5))

arr = np.matmul(a, b)
arr
>>
array([[[  70,   76,   82,   88,   94],
        [ 190,  212,  234,  256,  278],
        [ 310,  348,  386,  424,  462]],

       [[1510, 1564, 1618, 1672, 1726],
        [1950, 2020, 2090, 2160, 2230],
        [2390, 2476, 2562, 2648, 2734]]])
        
arr.shape
>>
(2, 3, 5)

 

난수 생성

numpy.random 모듈

  • 다양한 종류의 확률분포로부터 효과적으로 표본값을 생성
  • 파이썬 내장 random 모듈에 비해 더 효율적으로 값을 생성하여 파이썬 내장 모듈보다 수십 배 이상 빠른 속도
함수 설명
seed 난수 생성기의 seed를 지정
난수 발생을 위한 seed를 고정하여 reproduction 시 활용
permutation 순서를 임의로 바꾸거나 임의의 순열을 반환
shuffle 리스트나 배열의 순서를 뒤섞음
rand (0, 1) 범위의 균등분포에서 표본을 추출
randint 주어진 최소/최대 범위 내에서 임의의 난수 추출
randn 표준편차 1, 평균 0인 정규분포에서의 표본 추출
binomial 이항분포에서 표본 추출
normal 정규분포(가우시안)에서 표본 추출
beta 베타분포에서 표본 추출
chisquare 카이제곱 분포에서 표본 추출
gamma 감마분포에서 표본 추출
uniform 균등(0, 1)에서 표본 추출

 

728x90
반응형

'Python > Numpy' 카테고리의 다른 글

[Numpy] Numpy Shape Manipulation  (0) 2021.03.05
[Numpy] Numpy Vectorization & Broadcasting  (0) 2021.03.05
[Numpy] Numpy (Numerical Python)  (0) 2021.02.24