본문 바로가기
IT/Data Analysis with python

넘파이 기본: 배열과 백터연산 01

by Cyber_ 2024. 5. 17.

0. 넘파이에서 제공하는 기능

  • 빠른 배열 계산과 브로드캐스팅 기능을 제공하는 효율적인 ndarray
    브로드 캐스팅: 크기가 다른 배열간의 연산
    ndarray: 다차언 배열
  • 반복문을 작성할 필요할 필요 없이 전체 데이터 배열을 빠르게 계산하는 표준 수학 함수
  • 배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구와 메모리에 적재된 파일을 다루는 도구
  • 선형대수, 난수 생성기, 푸리에 변환 기능
    선형대수: 벡터 공간, 벡터, 선형 변환, 행렬, 연립 선형 방정식 등을 연구하는 대수학의 한 분야
    푸리에 변환: 시간이나 공간에 대한 함수를 시간 또는 공간 주파수 성분으로 분해하는 변환
  • C,C++, 포트란으로 작성된 코드를 넘파이와 연결하는 C API

1. 다차원 배열 객체 ndarray

1) ndarray 생성

import numpy as np
arr1 = np.array(data1)
  • 생성함수 종류: array, assarray, arange, ones, ones_like, zeros, zeros_like, empty, empty_like, full, full_like, eye, identity,
  • numpy.emty가 0으로 초기화된 배열을 반환하리라 가정하는 것은 안전하지 않다. 가비지값을 포합하기도 함

2) ndarray 자료형

arr1.dtype # 데이터 타입을 확인하는 함수
  • 자료형 종류: int8, uint8, int16, uint16, int32, uint32, int64, uint64, float16, float32, float64, float128, complex64, complex128, complex256, bool, object, string_, unicode

  • 타입변환함수: numpy.astype

3) 넘파이 배열의 산술 연산

  • 배열은 for문을 작성하지 않고 데이터를 일괄 처리할 수 있어 매우 중요하다(백터화)
  • 백터: 크기와 방향을 가짐
  • 스칼라: 방향을 갖지않고 크기만 가짐
  • 스칼라 인수가 포함된 산술 연산의 경우 배열 내의 모든 원소에 스칼라 인수가 적용
  • 브로드캐스팅: 크기가 다른 배열간의 연산

4) 색인과 슬라이싱 기초

  • 1차원 배열은 표면적으로 파이썬의 리스트와 유사하게 작동한다.
  • 파이썬에 내장된 리스트와 중요한 차이점은 배열 슬라이스가 원본 배열의 뷰라는 점
  • 만약 뷰가 아닌 ndarray 슬라이스의 복사본을 얻고 싶다면 arr[5:8].copy()로 명시적으로 배열을 복사해야한다.

5) 불리언 값으로 선택하기

names=np.addray(["Bob", "Joe", "Will", "Bob", "Will", "Joe", "Joe"]
data = np.array[[4,7],[0,2],[-5,6],[0,0],[1,2],[-12,-4],[3,4]]

mask = (names == "Bob") | (names == "Will")
data[mask]
data[~mask]
  • names에서 Bob의 인덱스를 data에 대입하여 찾을 수 있다.(배열의 색인으로 사용할 수 있다.)
  • ~ 연산자는 변수가 참조하는 불리언 배열을 뒤집고 싶을 때 유용하다.
  • 파이썬 예약어인 and와 or은 불리언 배열에서 사용할 수 없다. &와 |를 대신 사용한다.

6) 팬시 색인

  • 정수 배열을 사용한 색인
    arr = np.zeros((8,4))
    

for i in range(8):
arr[i] = i

arr[[4,3,0,6]]
arr[[-3,-5,-7]]

- 색인으로 음수를 사용하면 끝에서부터 행을 선택한다.

### 7) 배열 전치와 축 바꾸기
- 배열 전치: 데이터의 모양이 바뀐 뷰를 한환하는 특별한 기능
- T(transpose): 열과 행을 뒤집음
- numpy.dot: 행렬의 내적
- @연산자: 행렬 곱셈을 수행하는 또 다른 방법
- swapaxes: 두 개의 축 번호를 받아서 배열을 뒤바꾼다.
```python
arr = [[0,1,0],[1,2,-2],[6,3,2],[-1,0,-1],[1,0,1]]
arr.T @ arr
arr.swapaxes(0,1)

2. 난수 생성

  • numpy.random.standard_normal
  • from random import normalvariate 보다 수십 배 이상 빠르다.