ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python Numpy (4. Numpy 배열 인덱싱)
    Python/Python 2020. 1. 20. 18:53
    반응형

     

    import numpy as np
    np.random.seed(0) #재현 가능성을 위한 시드 값
    x1 = np.random.randint(10,size=6) # 1차원 배열
    x2 = np.random.randint(10,size=(3,4)) # 3x4 2차원 배열
    x3 = np.random.randint(10,size=(3,4,5)) # 3x4x5 3차원 배열

    각 배열은 속성으로 ndim(차원의 개수) , shape(각 차원의 크기) , size ( 전체 배열 크기)를 가지고있다.

    #각 배열은 속성으로 ndim(차원의 갯수 ) , shape(각 차원의 크기 ) , size(전체 배열의 크기) 를 가지고있다
    print('x3 ndim: ' ,x3.ndim)
    print('x3 shape : ' ,x3.shape)
    print('x3 size : ', x3.size )
    print('x3' , x3)

    실행결과 .

    #다른 유용한 속성으로 배열의 데이터 타입은 dtype이 있다
    print('dtype: ', x3.dtype)

    실행결과 

     

    print('itemsize: ',x3.itemsize , 'bytes')
    print('nbytes: ' , x3.nbytes , 'bytes ')

    실행결과 

     

    배열 인덱싱: 단일 요소에 접근하기 

    파이썬의 표준 리스트 인덱싱과 매우 유사하다

    #1차원 배열에서 i 번째(0부터 시작 ) 값에 접근하려면 파이썬 리스트에서와 마찬가지로 꺾쇠괄호 안에 원하는 인덱스를 지정하면된다.
    x1

    실행결과 

     

    x1[0]

    실행결과

     

    #배열의 끝에서부터 인덱싱하려면 음수 인덱스를 사용하면된다
    x1[-1] 
    

     실행결과 

    #다차원 배열에서는 콤마로 구분된 인덱스 튜플을 이용해 배열 항목에 접근할수있다.
    x2
    

     실행결과 

    1차원 배열 인덱싱 

    #배열 슬라이싱: 하위 배열에 접근하기
    # x[start:stop:step]
    
    #1차원 하위 배열
    x= np.arange(10)
    x

    실행결과

    x[:5] #앞에서부터 5개를 가져옴 

    실행결과 

     

    x[5:] #인덱스 5 다음 요소들
    

     

    x[4:7] #중간 4~7까지에 요소들을 출력

     

    x[::2] #하나 걸러 하나씩의 요소로 구성된 배열

    x[1::2] #인덱스 1에서 시작해 하나 걸러 하나씩 요소로 구성된 배열

     

    x[::-1] # 모든 요소를 거꾸로 나열

    x[5::-2] #인덱스 5부터 하나걸러 하나씩 요소를 거꾸로 나열

    다차원 하위배열 인덱싱 

    #다차원 하위 배열
    
    #다차원 슬라이싱도 콤마로 구분된 다중 슬라이스를 사용해 똑같은 방식으로 동작한다 . 
    
    x2

    x2[:2,:3] #두 개의 행, 세 개의 열

    x2[:3, ::2] # 모든 행 , 한 열 걸러 하나씩

    #하위 배열 차원도 함께 역으로 변환할 수 있다.
    x2[::-1 , ::-1]

    #배열의 행과 열에 접근하기 한 가지 공통으로 필요한 루틴은 배열의 단일 행이나 열에 접근하는 것이다.
    #이것은 콜론으로 표시된 빈 슬라이스를 사용해 인덱싱과 슬라이싱을 결합함으로써 할 수 있다.
    print(x2[:,0]) #x2 의 첫번째 열 
    print('-------------')
    print(x2[0,:]) #x2의 첫번째 행 

    print(x2[0]) # x2[0,:] 와 동일


    배열 슬라이스에 대해 알아야 할 중요한 사실 하나는 배열 슬라이스가 배열 데이터의 사본(copy)
    가 아닌 뷰 (view) 를 반환한다는 점이다. 이는 NumPy 배열 슬라이싱 파이썬 리스트 슬라이싱과
    다른 점 중 하나다. 리스트에서 슬라이스는 사본이다.

    # 배열 슬라이스가 배열 데이터의 사본(Copy) 이 아니라 뷰(View) 를 반환한다.
    
    print(x2)

    x2_sub = x2[:2, :2]
    print(x2_sub)

     

    x2_sub[0,0] = 99 
    print(x2_sub)

     

    print(x2) # View 를 반환한다는것을 알 수 있다. 
    
    #이 행위는 매우 유용하다. 큰 데이터세트를 다룰 때 기반 데이터 버퍼를 복사하지 않아도
    #이 데이터의 일부에 접근하고 처리할 수 있다는 뜻이다. 

    # 배열의 사본 만들기 
    # 때로는 배열이나 하위 배열 내의 데이터를 명시적으로 복사하는 것이 더 유용할 때가 있다.
    #그 작업은 Copy 메서드로 가장 쉽게 할 수 있다. 
    
    x2_sub_copy = x2[:2,:2].copy()
    print(x2_sub_copy)

    x2_sub_copy[0,0] = 42
    print(x2_sub_copy)

    print(x2) # copy 한 하위 배열을 수정해도 원래 배열이 그대로 유지된다는것을 알 수 있다. 

     

    #배열 재구조화 
    
    #배열의 형상을 변경하는것이다. 이를 가장 유연하게 하는 방법은 reshape() 메서드를 사용하는것이다.  
    grid = np.arange(1,10).reshape((3,3)) # grid라는 변수에 1~10 까지 3x3크기에 배열을 생성 
    print(grid)
    
    

     

    반응형

    댓글

Designed by Tistory.