ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python: numpy 라이브러리 정리(indexing, slicing, 정규분포 난수)
    Python 2021. 5. 30. 21:13

    데이터 처리 시 리스트 간의 다양한 연산이 필요하지만

    파이썬 기본 리스트는 이러한 기능이 부족하며 연산 속도도 빠르지 않다. 

     

    넘파이는 파이썬에서 수치 데이터를 다루는 가장 기본적이고 강력한 패키지로써 

    pandas, scikit-learn, tensorflow등이 넘파이 위에서 동작한다. 

     

    넘파이는 ndarray를 사용하는데 이는 C 언어에 기반한 배열 구조로써

    메모리를 적게 차지하며 속도가 빠르다. 

    또한 고급 연산자와 풍부한 함수를 제공한다. 

     

     

     

    1. 다차원 배열(ndarray)의 속성 

    # ndarray를 이용한 연산
    import numpy as np
    a = np.array(range(1, 11))
    b = np.array(range(10, 20))
    print(a)
    print(b)
    print(a+b)
    print(a-b)
    
    # 객체의 형태
    print(a.shape)
    
    # 객체의 차원
    print(a.ndim)
    
    # 객체의 내부 자료형
    print(a.dtype)
    
    # 객체의 내부 자료형이 차지하는 메모리 크기(bytes)
    print(a.itemsize)
    
    # 객체의 항목 수
    print(a.size)
    
    
    [ 1  2  3  4  5  6  7  8  9 10]
    [10 11 12 13 14 15 16 17 18 19]
    [11 13 15 17 19 21 23 25 27 29]
    [-9 -9 -9 -9 -9 -9 -9 -9 -9 -9]
    (10,)
    1
    int32
    4
    10

     

     

     

     

    2. 논리적 인덱싱

    # 논리적 인덱싱
    import numpy as np
    scores = np.array([84, 41, 70, 30, 100, 66, 30, 90, 91])
    print(scores)
    # 70점 이상 찾기
    print(scores[scores >= 70])
    
    [ 84  41  70  30 100  66  30  90  91]
    [ 84  70 100  90  91]

     

     

     

     

    3. 2차원 배열 

    import numpy as np
    
    array = [[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]]
    np_array = np.array(array)
    
    print("2차원 배열")
    print(np_array)
    
    print("2차원 배열 인덱싱")
    print(np_array[2][2])
    print(np_array[2, 2])
    # 단 np_array[0:2, 0:2] 와 np_array[0:2][0:2]는 다르다. 
    
    print("2차원 배열 요소 변경")
    np_array[2, 2] = 9.1234 # 실패 -> 정수만 저장
    print(np_array)
    
    print("2차원 배열 일부 추출")
    print(np_array[1][0:2])
    
    print("2차원 배열에서 하나의 행 지정")
    print(np_array[2])
    
    print("2차원 배열 논리적인 인덱싱 - 짝수")
    print(np_array[np_array%2==0])
    
    print("2차원 배열 논리적인 인덱싱 - 세번째 열")
    print(np_array[:, 2])
    2차원 배열
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
     
    2차원 배열 인덱싱
    9
    9
    
    2차원 배열 요소 변경
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
     
    2차원 배열 일부 추출
    [4 5]
    
    2차원 배열에서 하나의 행 지정
    [7 8 9]
    
    2차원 배열 논리적인 인덱싱 - 짝수
    [2 4 6 8]
    
    2차원 배열 논리적인 인덱싱 - 세번째 열
    [3 6 9]
    

     

     

     

     

    4. numpy 함수 사용하기(arange, linespace, reshape, flatten) 

    import numpy as np
    print("arange 사용하기")
    # array + range
    # np.arange([시작], [끝], [간격])
    np_array = np.arange(1, 30, 5)
    print(np_array)
    
    
    print("linespace 사용하기")
    # 시작값부터 끝값까지 균일한 간격으로 지정된 개수만큼 배열 생성
    ls = np.linspace(0, 10, 10)
    print(ls)
    
    
    print('reshape 사용하기')
    np_array = np.arange(1, 30, 3)
    # (2, 5) 크기로 배열을 reshape한다.
    rs = np_array.reshape(2, 5)
    print(rs)
    
    
    # 인수로 -1 전달시 데이터 개수에 맞춰서 자동으로 배열 형태 결정
    print(rs.reshape(5, -1))
    # 데이터 갯수가 맞지 않으면 에러가 발생한다.
    
    
    print('flatten 사용하기')
    # 2차원 이상의 배열을 1차원 배열로 생성
    np_array = np.arange(1, 30, 3).reshape(5, -1)
    print(np_array)
    print(np_array.flatten())
    
    arange 사용하기
    [ 1  6 11 16 21 26]
    
    linespace 사용하기
    [ 0.          1.11111111  2.22222222  3.33333333  4.44444444  5.55555556
      6.66666667  7.77777778  8.88888889 10.        ]
      
    reshape 사용하기
    [[ 1  4  7 10 13]
     [16 19 22 25 28]]
     
    [[ 1  4]
     [ 7 10]
     [13 16]
     [19 22]
     [25 28]]
     
    flatten 사용하기
    [[ 1  4]
     [ 7 10]
     [13 16]
     [19 22]
     [25 28]]
     
    [ 1  4  7 10 13 16 19 22 25 28]

     

     

     

     

    5. numpy 난수 생성하기 

    print("난수 생성")
    # 난수의 seed를 먼저 생성
    np.random.seed(100)
    
    # 의사 난수 생성
    print(np.random.rand(5))
    
    # 난수로 이루어진 이차원 배열(3x5)생성
    print(np.random.rand(3, 5))
    
    # 30에서 40 사이의 (2, 2) 난수 배열 생성
    print(np.random.rand(2, 2)*10 + 30)
    
    print("정수 난수 생성")
    # 1에서 6까지의 정수 난수 중 10개 출력
    print(np.random.randint(1, 7, size=10))
    
    # 3x4 배열의 1에서 30까지의 정수 난수
    print(np.random.randint(1, 31, size=(3, 4)))
    
    난수 생성
    [0.54340494 0.27836939 0.42451759 0.84477613 0.00471886]
    
    [[0.12156912 0.67074908 0.82585276 0.13670659 0.57509333]
     [0.89132195 0.20920212 0.18532822 0.10837689 0.21969749]
     [0.97862378 0.81168315 0.17194101 0.81622475 0.27407375]]
     
    [[34.31704184 39.4002982 ]
     [38.17649379 33.3611195 ]]
     
     정수 난수 생성
    [4 1 3 2 2 4 3 6 4 1]
    
    [[15 18 17 16]
     [ 8 14  7 13]
     [19  1 25  3]]

     

     

     

     

    6. numpy 정규분포 난수 생성하기 

    print("정규 분포 난수 생성")
    # 정규분포를 갖는 난수를 생성한다.
    print(np.random.randn(5))
    
    
    # 평균이 10이고 표준편차가 2인 정규분포 (3x4) 난수 생성
    mean = 10
    sigma = 2
    randoms = 10+sigma*np.random.randn(3, 4)
    print(randoms)
    
    
    # 평균과 중간값 계산하기
    print("평균 계산하기")
    print(np.mean(randoms))
    
    
    print("중간값 계산하기")
    print(np.median(randoms))
    정규 분포 난수 생성
    [ 0.18451869  0.9370822   0.73100034  1.36155613 -0.32623806]
    
    [[10.11135203 10.44479922  7.11356601  8.48729539]
     [11.63290802 11.50088952  9.08810615 12.37924454]
     [ 6.61876635  7.2872019   7.53513097  8.91112168]]
     
    평균 계산하기
    9.259198480812097
    
    중간값 계산하기
    8.999613910859534

     

    반응형

    댓글

Designed by Tistory.