ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 데이터사이언스 핸드북 2 장 - NumPy 배열의 기본 기능
    데이터 분석/NumPy 2020. 5. 16. 12:49

     

    기본 배열 조작 기능 목차

    배열 속성 지정: 배열의 크기, 모양, 메모리 소비량, 데이터 타입을 결정

    배열 인덱싱: 개별 배열 요솟값을 가져오고 설정

    배열 슬라이싱: 큰 배열 내에 있는 작은 하위 배열을 가져오고 설정

    배열 재구조화: 해당 배열의 형상을 변경

    배열 결합 및 분할: 여러 배열을 하나로 결합하고 하나의 배열을 여러 개로 분할

     

     

    배열의 기본 속성들

    NumPy 배열의 속성

     

    ndim (차원의 개수), shape (각 차원의 크기), size (전체 배열의 크기)

    dtype (배열의 데이터 타입), 각 배열 요소의 크기 (itemsize), 배열의 전체 크기 (nbytes)

     

    차원의 갯수는 [ ] 의 숫자이다. 

    shape 속성으로 반환된 tuple 의 각 값은 tuple 인덱스 순서대로 각 차원이 가지고 있는 요소의 갯수이다. 

    (3,4,5) 의 경우, 3개의 차원이고, 1차원에 3개 / 2차원에 4개 / 3차원이 5개의 요소가 들어간다. 

    그리고 size 전체 배열의 크기는 3 x 4 x 5 = 60 , 총 60개이다. 

     

    NumPy 배열의 데이터타입 [링크]

    int4, int8 와 같이 한 요소가 가지게 되는 메모리 크기를 제한하여, 메로리를 효율적으로 사용할 수 있다.  *빅 엔디언이나 리틀 엔디언 숫자처럼 고급 타입을 지정하는 것도 가능하다. NumPy 는 복합 데이터 타입 (compound data type) -배열 단위가 아니라 요소 단위로 데이터타입- 을 지정할 수 있도록 한다. 

    https://www.w3schools.com/python/numpy_data_types.asp

     

    NumPy Data Types

    NumPy Data Types Data Types in Python By default Python have these data types: strings - used to represent text data, the text is given under quote marks. eg. "ABCD" integer - used to represent integer numbers. eg. -1, -2, -3 float - used to represent real

    www.w3schools.com

     

    *빅 엔디언 & 리틀 엔디언 에 대해 잘 소개된 글: https://ahnjg.tistory.com/37

    엔디언은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻한다. 바이트 순서에 따라 빅 엔디언과 리틀 엔디언을 나눌 수 있다. 빅 엔디언은 사람이 숫자를 쓰는 방법과 같이 큰 단위의 바이트가 앞에 오는 방법이고, 리틀 엔디언은 반대로 작은 단위의 바이트가 앞에 오는 방법이다. 빅 엔디언은 사람이 숫자를 쓰는 순서를 따르니 디버깅이 편하고, 리틀 엔디언은 작은 숫자일 때 앞에 있는 값만 읽고 처리하면 되어서 효율적이다. 하지만 컴퓨팅이 발달한 지금은 두 방식의 차이가 의미없어지고 있다고 한다...ㅎ

     

    빅 엔디언 vs 리틀 엔디언

    1. 엔디언(Endianness) 이란? 엔디언은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻한다. [1, 2, 3, 4, 5] 2. 빅 엔디언과 리틀 엔디언 바이트 순서는 크게 빅 엔�

    ahnjg.tistory.com

     

     

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

    NumPy 배열의 값 불러오기 및 설정

     

    [ 를 만날 때 마다, 찾아갈 요소의 위치를 적어주면 된다.

    x2 는 ( 2, 3 ) 형태로 2차원 배열이고, 한 차원에 3개의 값이 들어있다. 

     

     

    배열 슬라이싱: 하위 배열에 접근하기

    : 기호로 표시되는 슬라이스(slice) 표기법으로 하위 배열에 접근할 수 있다.

     

      x [ start : stop : step]  

    - start 인덱스부터 (stop-1) 인덱스의 값까지 

    - start, star+1step, start+2step 과 같이 step 간격의 요소를 추출해라

    - step 은 생략가능하다.  즉, x[5:] 로 : 가 하나만 있으면 start:end 만 표시하는 것이다.

    - default값: start = 0, stop = 차원크기, step = 1  (처음부터 끝까지 모든 요소 추출)

     

    NumPy 1차원 배열의 슬라이싱

     

    NumPy 2차원 배열의 슬라이싱

     

    [ ] 의 갯수가 차원의 크기이다. 

    1번째 차원 [ ] 안에 포함된 element는 총 3개이다: [3,5,2,4],  [7,6,8,8],  [1,6,7,10]

    2번째 차원의 [ ] 안에 포함된 element 는 총 4개이다: [3,5,2,4] element 안의 element 3,5,2,4

     

     

    사본이 아닌 뷰로서의 하위 배열

    배열 슬라이스는 배열 데이터의 사본(copy)가 아니라 뷰(view) 를 반환한다. (파이썬 리스트의 슬라이스는 사본이지만)

    배열 슬라이스는 뷰를 반환한다.

     

    배열의 사본 만들기

    배열이나 하위 배열 내의 데이터를 명시적으로 복사하고 싶을 경우 copy() 메소드를 사용한다.

     

      x2_sub_copy = x2 [:2, :2].copy()  

     

    배열의 사본을 만들려면 명시적으로 copy() 

     

     

    배열 재구조화

    배열의 reshape() 도 배열 데이터의 사본(copy)가 아니라 뷰(view) 를 반환한다.

      a.reshpae(newShape_tuple or -1)  

    배열의 재구조화 reashpe()

     

    다차원 배열을 1차원 배열로 reshape(-1)

     

     

    배열 연결

    여러 배열을 하나로 결합하거나, 반대로 하나의 배열을 여러 개의 배열로 분할하는 것도 가능하다. np.concatenate, np.vstack, np.hstack 

     

    array concatenate with axis

    배열간 연결 연산한다. axis 옵션을 통해 어느 차원에서 연산할 지를 지정해준다. 연산 대상이 되는 차원 내 요소의 크기가 같아야 한다.

     

    1차원의 요소의 크기가 달라서 연결실패!

    axis = 0  1차원에서 연산하려고 했는데, 각 배열의 1차원 내 요소의 크기가 달라서 연결 실패했다!

     

    vsatck, hstack - stack 의 원리 도입 

    vstack (Vertical Stack) 은 1차원 단위의 내부 요소를 연결하였다.  [1,2,3], [4,5,6], [7,8,9] 요소 나열

    hstack (Horizontal Stack) 은 동일한 차원을 전제한 상태에서, 뒤에 요소만 연결하였다. [9,8,7, 그리고 99] 

     

     

    배열 분할

    결합의 반대는 분할로, np.split, np.hsplit, np.vsplit 함수로 구현된다. 각 함수에 분할 지점을 알려주는 인덱스 목록을 전달할 수 있다.

     

      np.split(분할대상, [분할위치1, 분할위치2, ...]  

    N 개의 분할점은 N+1  개의 하위 배열을 만든다. 

    split

     

     

      np.vsplit|hsplit(분할대상, [분할위치1, 분할위치2...])  

    split 방식을 지정하여 vsplit, hsplit 을 활용할 수도 있다. vsplit 은 수직으로 / hsplit 은 수평으로 분할한다. 

    vsplit

    왠지 엑셀파일에서 동일한 데이터셋에 대해 행으로 분할하는 것과 동일한 개념이다. 

     

    hsplit

    엑셀파일에서 필요한 컬럼만 분할하여 추출하는 것과 동일한 개념!

     

    np.dstack, np.dsplit 은 세번째 축을 따라 배열을 분할한다고 하는데... 일단 이건 너무 복잡하니까 스킵하고 필요할 때 공부해야겠다 ;ㅁ;ㅎ (기본 기능들 양이 좀 많아서 지쳤으니)

     


    이 포스트에서 소개하는 연산 유형이 다소 무미건조하고 현학적인 것 처럼 보일 수 있지만, 이 책에 사용된 다른 많은 예제의 기초가 되니 잘 알아두자!

    라고 책에 언급되어있었으니, 그래도 잘 따라온 나에게 칭찬 ㅇ__ㅇ. 동작방식이 추가적으로 궁금한건 추가실험코드를 작성해서 기초 탄탄하게 공부했다. 뿌듯.

    댓글

Designed by Tistory.