본문 바로가기

파이선

Numpy기본 : 배열과 백터 연산 (chap4)

Numpy : 파이선에서 산술계산을 위한 가장 중요한 필수 패키지

               반복문을 사용하지 않고, 간결한 배열 연산을 사용해 많은 데이타 처리가 용이하다

              → 특히, 브로드캐스팅은 강력한 벡터 연산 방법이다.

생각해보기 : 접근할때, 데이타를 배열 위주로 프로그래밍 한다고 생각의 틀이 변경되어야 할거 같다.

                   sql을 처음 접하고 쿼리를 작성할 때, 데이타 간의 relation을 잘 생각하면

                    더 쉽게 어려운 쿼리를 작성하는 것과 비슷한 윈리!!

 

  • ndarray : 다차원 배열 객체
    • N차원의 배열객체
    • 대규모 데이터 집합을 담을 수 있는 유연한 자료구조
    • 전체 데이타 블록에 수학적인 연산을 수행 지원
    • type : numpy.ndarray
    • P.136 : data + data를 수행하는데, 출력되는 데이타가 이해가 되지 않는다.
    • np.shape : 튜플 형태로 가로X세로 형태로 정보 반환
    • np.dtype : 배열에 저장된 자료형 출력 (ndarray를 구성하는 원소에는 모두 동일한 자료형이여야 한다.)
      • 메모리에 있는 특정 데이타를 해석하기 위한 메타 데이타의미의 객체
    • np.ndim : 몇차원으로 구성되어 제공 (shape의 앞의 부분을 의미)
    • np.astype(np.int32) : np객체의 타입을 지정하는것 (해당 예제는 int32로 지정하는 샘플)
      → astype을 호출하면, 새로운 dtype이 이전 dtype과 동일해도 새로운 배열을 복사하여 새로 생성한다.
      → 생성된 np객체에 대해서 astype을 이용할수도 있고, np생성시, dtype을 이용해서 생성할 수도 있다.

      • arr1 = np.array([1.1, 2.2, 3.3])
        arr1.astype(np.int32))
      • arr1 = np.array([1.1, 2.2, 3.3], dtype=np.int32)
  • ndarray 생성하기
    • np.array(list[])
    • np.zeros : 생성시, 값을 0으로 채워서 생성
    • np.ones : 생성시, 값을 1로 채워서 생성
    • 추가적인 다양한 생성함수는 P.139에 설명되어있다.
  • Numpy 백터화 (배열의 산술 연산)
    크기가 다른 배열간의 연산 : 브로드캐스팅 이라고 한다. 
    • arr : 2차원 배열 [[1,2,3], [1,2,3]]
    • arr * arr
    • arr - arr
    • arr + arr
    • arr / arr
    • arr ** arr
    • arr > arr : 비교 연산을 해서 boolean연산을 수행한다.
  • 슬라이싱
    • 리스트와 문법은 동일하다
      • [1:3], [1], [:]
      • 차이점 : numpy의 슬라이싱은, 원본 배열에 그대로 반영된다.
        • Numpy는 대용량 처리를 목적으로 하기 때문에, 복사를 진행하지 않게 설계되었다고 한다.(메모리 및 성능 이슈)
        • test_slice = arr[0:3]으로 정의 후, test_slice[0] = "test"라고 정의하면 arr[0]의 값이 변경된다.
        • .copy를 통해서 명시적으로 복사 할수 있다.
    • 2차원 배열에 대한 Sliding
      • twoarr = np.array([1,2,3],[4,5,6],[7,8,9])
      • twoarr[2] : out) [7,8,9] 1차원 배열
      • twoarr[0][1] / twoarr[0,1] : out) 2
      • 아래와 같은 패턴이 가능하고, 데이타를 부분적으로 추출이 가능하다.
        • arr[:2, 1:]
        • arr[2]
        • arr[2, :]
        • arr[2:, :]
        • arr[:, :2]
        • arr[1, :2]
        • arr[1:2, :2]
    • 3차원 배열에 대한 Sliding
      • threearr = np.array( [[ [1,2,3],[4,5,6]] ,[ [7,8,9], [10,11,12]] ])
      • threearr[1,1] : out) [10,11,12]
  • boolean값으로 np객체 선택하기
    • 2차원 데이타에 대한 boolean처리는 pandas에서 처리하는것이 편하다고 한다. 
    • and, or (사용불가), &, | (사용가능) 
    • boolean조건을 걸고, data[조건 == '비교값'] = 변경하려는 값 을 통해서 data의 배열에 값을 변경처리한다.
      • data[data > 0 ] = 0
      • data[name != 'king'] = 7
  • 팬시 색인
    • 위에 있는 그림처럼 2차원 배열이 있는 경우
      • array[4,3,0,6]은 해당 열에 해당하는 row을 추출
      • array[-2,-3,-7] : 끝에서 부터 추출 진행 (즉 뒤에서 부터 순서를 2번째, 3번째, 7번째 값을 추출한다.)
  • 배열 축 바꾸기
    • arr.T : 배열의 x,y축 변경 
      • 3*7 배열 -> 7*3배열
      • 데이타는 복사하지 않고 처리한다.
    • arr.transpose
    • arr.swapaxes
  • 유니버설 함수
    • 배열의 각 원소를 빠르게 처리(고속처리)하는 함수, 
    • ufunc라고 부름
    • ndarray안에 있는 데이터 원소별로 연산을 수행
    • 하나이상의 스칼라값을 받아서 하나이상의 스칼라 값을 반환 : 백터화된 래퍼 함수
    • 단항 유니버설 함수 (P. 160에 상세히 정리됨)
      • np.sqrt : 제곱근
        • arr ** 0.5 와 동일 
        • sqry(x^2 + y^2 ) = np.sqry(x **2 + y**2)로 표기 할 수 있다.
      • np.exp : 밑이 자연상수 e인 지수함수(e^x)
    • 이항 유니버설 함수 (P. 160에 상세히 정리됨)
      • add, maxium : 2개의 인자를 받는것
  • 배열기반 프로그래밍
    • np.meshgrid : (x,y) array를 2차원 배열로 가능한 모든 짝을 만든다.
    • 조건 걸기
      • numpy.where 함수
      • np.where(cond, arr1, arr2) :첫번째 인자값의 조건을 체크해서, True이면 두번째 항목, False이면 3번째 항목을 선택
      • np.where(arr > 0, 2, -2) : 조건에 맞으면 전부 2로 치환, 틀리면 -2로 치환 하는 기능
    • 수학 메소드 (P.167에 메소드 종류 정의)
      • sum, mean(평균), std(표준편차)등
        2가지 방식으로 추출 가능 : 배열.sum(), np.sum(배열)
      • 인자값으로 axis선언하는 방식
        1 : raw의 합을 구하라는 의미
        0 : 모든 컬럼에 대해서 구하라는 의미 

        • cumsum / cumprod메소드 : 중간 계산값을 담고 있는 배열 변환
      • bool 연산 조회
        • any : 하나 이상일때 True
        • all : 모두 True일때 True
      • 정렬
        • arr.sort()
        • arr.sort(1) : 다차원 배열의 경우 sort메소드에 넘긴 축의 값에 따라서 1차원 부분 정렬
      • 집합 (P.170에 메소드 종류 정의)
        • np.unique : 배열내에 중복원소 제거하고, 정렬해서 반환
        • np.in1d : 두개의 배열을 받아서 포함여부를 boolean 배열로 반환
    • numpy 파일 입출력
      •  텍스트나, 표는 보통 pandas를 이용한다.
      • np.save, np.load 배열 데이타 저장 방식 
        • 저장을 하면 확장자는 npy이고, 해당 파일의 내용은 binary형태의 파일이다.
      • np.savez : 어려개의 배열을 압축된 형식으로 저장
    • 선형대수
      • 행렬의 곱셈, 분할, 행렬식 그리고 정사각 행렬 수학 // 배열을 다루는 중요한 Library
      • 2차원 배열 곱셈 : 행렬 곱셈이 아니라, 대응하는 각각의 원소의 곱을 계산
      • dot함수 : 행렬곱셈 처리
        계산되는 과정 풀이
      • numpy.linalg
        • 행렬의 분할 과 역행렬, 행렬식을 포함하고 있다.
        • P.174 : 주요함수
      • numpy.random
        • 난수생성
        • 파이선의 random 함수와 다르다
        • 다양한 종류의 확률분포로 부터 효과적으로 표본값을 생성하는데, 주로 사용됨
        • P.175 : 주요 함수
    •