머신러닝/numpy

NumPy의 기초(3)

빈코더 2021. 9. 9. 22:38
728x90

배열 전치와 축 바꾸기

배열 전치는 데이터를 복사하지 않고 데이터의 모양이 바뀐 뷰를 반환하는 특별한 기능이다.

ndarray는 transpose 메서드와 T라는 이름의 특수한 속성을 가진다.

arr = np.arange(15).reshape((3,5))
arr
  array([[ 0,  1,  2,  3,  4],
         [ 5,  6,  7,  8,  9],
         [10, 11, 12, 13, 14]])

arr.T
  array([[ 0,  5, 10],
         [ 1,  6, 11],
         [ 2,  7, 12],
         [ 3,  8, 13],
         [ 4,  9, 14]])

arr = np.random.randn(6,3)
arr
  array([[-0.99938261, -0.02133965, -0.88106858],
         [ 0.5428376 , -0.29822089, -0.44197411],
         [-0.48781523,  2.43095275, -1.72644223],
         [ 2.41046237,  2.23152234, -0.04589103],
         [-0.91537528, -0.09371398,  0.43804106],
         [ 1.01468276, -0.46374293, -0.86163677]])

#np.dot을 사용하면 내적을 구할 수 있다.
np.dot(arr.T, arr) 
  array([[ 9.20922381,  3.66781732,  0.09691071],
         [ 3.66781732, 11.20245415, -3.79017138],
         [ 0.09691071, -3.79017138,  4.88862962]])

arr = np.arange(16).reshape((2,2,4))
arr
  array([[[ 0,  1,  2,  3],
          [ 4,  5,  6,  7]],

         [[ 8,  9, 10, 11],
          [12, 13, 14, 15]]])

#다타원 배열의 경우 transpose메서드는 튜플로 축 번호를 받아서 치환한다. 
arr.transpose((1,0,2)) 
  array([[[ 0,  1,  2,  3],
          [ 8,  9, 10, 11]],

         [[ 4,  5,  6,  7],
          [12, 13, 14, 15]]])

T 속성을 이용하는 간단한 전치는 축을 뒤바꾸는 특별한 경우다.

ndarray에는 swapaxes라는 메서드가 있는데 두개의 축 번호를 받아서 배열을 뒤바꾼다.

arr
  array([[[ 0,  1,  2,  3],
          [ 4,  5,  6,  7]],

         [[ 8,  9, 10, 11],
          [12, 13, 14, 15]]])

# swapaxes도 마찬가지로 데이터를 복사하지 않고 원래 데이터에 대한 뷰를 반환한다.
arr.swapaxes(1,2) 
  array([[[ 0,  4],
          [ 1,  5],
          [ 2,  6],
          [ 3,  7]],

         [[ 8, 12],
          [ 9, 13],
          [10, 14],
          [11, 15]]])

유니버설 함수

ufunc라고 불리기도 하는 유니버설 함수는 ndarray안에 있는 데이터 원소별로 연산을

수행하는 함수이다. 유니버설 함수는 하나 이상의 스칼라값을 받아서 하나 이상의

스칼라 결과값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 벡터화 된 래퍼 함수이다.

ufunc는 sqrt나 exp 같은 간단한 변형을 전체 원소에 적용할 수 있다.

arr = np.arange(10)
arr
  array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.sqrt(arr)
  array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
         2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])

np.exp(arr) 
  array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
         5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
         2.98095799e+03, 8.10308393e+03])

위 함수들을 단한 유니버설 함수라고 한다.

add나 maximum처럼 2개의 인자를 취해서 단일 배열을 반환함는 함수를 이항 유니버설 함수라고 한다.

x = np.random.randn(8)
y = np.random.randn(8)

x,y
  (array([-1.50111342, -1.88980874,  0.65227619, -1.93622089,  0.53157456,
        -1.07868677,  0.06593375, -0.03895261]),
   array([-0.15219233,  1.22053143, -0.94031911, -0.25735887, -2.40495667,
           0.90313322,  0.78062795, -0.04421286]))

np.maximum(x,y) # x와 y의 원소중 가장 큰 값을 계산한다.
  array([-0.15219233,  1.22053143,  0.65227619, -0.25735887,  0.53157456,
          0.90313322,  0.78062795, -0.03895261])

흔하지는 않지만 여러 개의 배열을 반환하는 유니버설 함수도 있다.

modf는 파이썬 내장 함수인 divmod의 벡터화 버전인데, 분수를 받아서 몫과 나머지를 함께 반환한다.

arr = np.random.randn(7) * 5
arr
  array([-5.19991415,  2.78124408,  1.05056945,  0.64982977, -3.40538105,
             5.40576203,  2.54864648])

remainder, whole_part = np.modf(arr)
remainder, whole_part
  (array([-0.19991415,  0.78124408,  0.05056945,  0.64982977, -0.40538105,
           0.40576203,  0.54864648]),
   array([-5.,  2.,  1.,  0., -3.,  5.,  2.]))

유니버설 함수는 선택적으로 out 인자를 취해 계산 결과를 따로 저장할 수도 있다.

arr
  array([-5.19991415,  2.78124408,  1.05056945,  0.64982977, -3.40538105,
          5.40576203,  2.54864648])

np.sqrt(arr)
  array([       nan, 1.66770623, 1.0249729 , 0.80612019,        nan,
         2.32502947, 1.59644808])

np.sqrt(arr,arr)
  array([       nan, 1.66770623, 1.0249729 , 0.80612019,        nan,
       2.32502947, 1.59644808])

유니버설함수 종류

단항 유니버설 함수
  • abs, fabs: 각 원소(정수,부동소수점수,복소수)의 절댓값을 구한다. 복소수가 아닌 경우 에는 빠른 연산을 위해서 fabs를 사용한다.
  • sqrt: 각 원소의 제곱근을 계산한다. arr ** 0.5와 같다.
  • square: 각 원소의 제곱을 계산한다. arr ** 2와 같다.
  • exp: 각 원소에서 지수 e**x을 계산한다.
  • log,log10,log2,log1p: 각각 자연로그, 로그10, 로그2, 로그(1+x)
  • sign: 각 원소의 부호를 계산한다. 1(양수),0(영),-1(음수)
  • ceil: 각 원소의 소수자리를 올린다. 각 원소의 값보다 같거나 큰 정수 중 가장 작은 정수를 반환한다.
  • floor: 각 원소의 소수자리를 내린다. 각 원소의 값보다 작거나 같은 정수 중 가장 작은 수를 반환한다.
  • rint: 각 원소의 소수자리를 반올림한다. dtype은 유지된다.
  • modf: 각 원소의 몫과 나머지를 각각의 배열로 반환한다.
  • isnan: 각 원소가 숫자가 아닌지(NaN, Not a Number)를 나타내는지 불리언 배열을 반환한다.
  • isfinite,isinf: 각 배열읠 각 원소가 유한하지(non-inf, non-NaN), 무한한지 나타내는 불리언 배열을 반환한다.
  • cos, cosh, sin, sinh, tan, tanh: 일반 삼각함수와 쌍곡삼각함수
  • arccos, arccosh, arcsin, arcsinh, arctan, arctanh: 역삼각함수
  • logical_not: 각 원소의 논리 부정(not)값을 계산한다. ~arr와 동일
이항 유니버설 함수
  • add: 두 배열에서 같은 위치의 원소끼리 더한다.
  • subtract: 첫 번째 배열의 원소에서 두 번째 배열의 원소를 뺀다.
  • multiply: 배열의 원소끼리 곱하낟.
  • divide, floor_divide: 첫 번째 배열의 원소를 두 번째 배열의 원소로 나눈다. floor_divide는 몫만 취한다.
  • power: 첫 번째 배열의 원소를 두 번째 배열의 원소만큼 제곱한다.
  • maximum, fmax: 각 배열의 두 원소 중 큰 값을 반환한다. fmax는 NaN을 무시한다.
  • minimum, fmin: 각 배열의 두 원소 중 작은 값을 반환한다. fmim은 NaN을 무시한다.
  • mod: 첫 번째 배열의 원소를 두 번째 배열의 원소로 나눈 나머지를 구한다.
  • copysign: 첫 번째 배열의 원소의 기호를 두 번째 배열의 원소의 기호로 바꾼다.
  • greater, greater_equal, less, less_equal, equal, not_equal: 각가 두 원소 간의 >, >=, <, <=, ==, != 비교 연산 결과를 불리언 배열로 반환한다.
  • logical_end, logical_or, logical_xor: 각각 두 원소 간의 &, |, ^의 논리 연산 결과를 반환한다.
728x90

'머신러닝 > numpy' 카테고리의 다른 글

NumPy의 기초(5)  (0) 2021.10.06
NumPy의 기초(4)  (0) 2021.10.06
NumPy의 기초(2)  (0) 2021.09.09
NumPy의 기초(1)  (0) 2021.09.09