데이터를 다루는 데 있어 필수 도구인 numpy의 기본 사용법부터 이를 활용한 데이터 조작 방법까지 알아보고자 한다.

기본적인 배열 생성

  • np.array
    numpy 배열은 모든 요소가 동일한 데이터 타입을 가져야 한다. 만약 다른 타입의 데이터가 배열에 포함된다면, numpy는 자동으로 모든 요소를 하나의 고차원 타입으로 변환한다.
import numpy as np

print(np.array([1, 2, 4.5, 5]))  # 모든 요소가 실수형으로 변환
print(np.array([1, 'a', 5.5]))   # 문자열이 포함되어 모든 요소가 문자열로 변환
  • np.arange
    np.arange는 지정된 범위 내에서 배열을 생성하며, np.array와는 다르게수학적 연산에 직접 사용될 수 있다.
print(np.arange(0, 10) + 2)  # 정상 출력 [ 2  3  4  5  6  7  8  9 10 11]
print(np.array(0, 10) + 2)  # TypeError 발생 

배열 연산

  • np.sum
    배열의 축에 따라 합계를 구함
arr = np.arange(2*3*4).reshape(2,3,4)
>>[[[ 0  1  2  3]
    [ 4  5  6  7]
    [ 8  9 10 11]]

   [[12 13 14 15]
    [16 17 18 19]
    [20 21 22 23]]]
    
print(arr.sum(0)) # 첫 번째 차원 기준으로 더함
>>[[12 14 16 18]
   [20 22 24 26]
   [28 30 32 34]]

print(arr.sum(1)) # 두 번째 차원 기준으로 더함
>>[[12 15 18 21]
   [48 51 54 57]]

print(arr.sum(2)) # 세 번째 차원 기준으로 더함
>>[[ 6 22 38]
   [54 70 86]]
  • 연산 메소드
x=np.arange(1,11)
y=np.arange(11,21)

np.add(x,y)
np.abs(x-y)
np.exp2(x)
np.power(3,x)
np.log(x)
np.sum(x) = x.sum()
np.prod(x) = x.prod()
np.argmax(x)  # x 원소 중 최댓값의 위치(index)
np.argmin(x)  # x 원소 중 최솟값의 위치(index)
np.median(x)
np.percentile(x,80)  #상위 20% 

난수 생성

print(np.random.random(10))  # 0과 1 사이의 난수
print(np.random.randint(1, 37, (5, 6)))  # 1과 36 사이의 정수 난수 (5행 6열)
print(np.random.normal(0, 1, (3, 3)))  
# 평균 0, 표준편차 1의 정규분포 난수 (3행 3열)
# np.random.normal(평균, 표준편차, 몇개) 
np.random.randn(2,3)
# 평균 0, 표준편차 1의 가우시안 표준정규분포 난수를 matrix array(2,3) 생성 

배열의 구조 변경

  • reshape
array.reshape(-1,1) 

원본 ndarray가 어떤 형태라도 2차원이고, 여러개의 row를 가지되 반드시 1개의 칼럼을 가진 ndarray로 변환

  • 배열 결합
    np.r_[a,b] = np.concatenate((a,b), axis=0)
#======= np.r_, np.c_=======
a = [1, 2, 3]
b = [4, 5, 6]
print(np.r_[a,b])     # => [1,2,3,4,5,6] 
print(np.r_[[a],[b]]  # => [[1,2,3]
					  #		[4,5,6]]
print(np.c_[a,b])     # => [[1,4]
					  #	    [2,5]
                      #     [3,6]]
                      
#======= np.concatenate=======
a = np.array([[1, 2], [3, 4]])  # (2, 2)
b = np.array([[5, 6]])          # (1, 2)  
np.concatenate((a, b), axis=0)  # (3, 2)
>>array([[1, 2],
         [3, 4],
         [5, 6]])
np.concatenate((a, b.T), axis=1)  # (2,3)
>>array([[1, 2, 5],
         [3, 4, 6]])
np.concatenate((a, b), axis=None)
>>array([1, 2, 3, 4, 5, 6])
  • 축 재배치
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
>>array([[[1, 2],
          [3, 4]],
          
          [[5, 6],
          [7, 8]]])
new_arr = np.moveaxis(arr, 0, -1) # 첫 번째 축(0)을 마지막 축(-)으로 이동
print(new_arr)
>> array([[[1, 5],
          [2, 6]],

         [[3, 7],
          [4, 8]]])
  • 차원 확장
array = np.expand_dims(df.values, axis=0)

데이터 전처리

  • np.where
    조건에 따른 데이터 변환
pred = np.random.rand(10)
pred_label = np.where(pred > 0.5, 1, 0)
print(pred_label)
  • np.digitize
    연속형 변수의 구간화
np.digitize(df[col], bins) 
  • np.sort
    순서 정렬
np.sort(acc_arr)[::-1]  #내림차순으로 

확인 메소드

  • np.any
np.any(x>8)    #하나라도 있으면 True
  • all, allclose
    오차범위에 따른 두 배열간 비교
a1 = np.arange(1, 10, step=0.5)
a2 = np.arange(0.8, 0.9, step=0.5)

np.all(a1==a2)                # False (모두 같은지)
np.allclose(a1, a2, rtol=0.2) # False (모두 오차범위 0.2 이내인지)
np.allclose(a1, a2, rtol=0.3) # True (모두 오차범위 0.3 이내인지) 
profile
ML/DL swimmer

0개의 댓글