Programming/Python
Numerical Python - numpy
aram
2022. 8. 26. 10:05
numpy
- 수치해석, 과학계산을 위한 파이썬 핵심라이브러리
- C언어로 구현된 라이브러리
- array 단위 > 데이터 관리 및 연산 수행
- ndarray : nd(다차원) + array(배열, 동일한 타입의 값을 요소로 저장)
= 고성능의 다차원 배열 자료구조 - NumPy documentation : https://numpy.org/doc/stable/
- 호출 = import numpy as np
numpy 다차원 배열이란?
- 적은 메모리로 많은 데이터를 빠르게 처리 가능
- 모든 원소 = 같은 자료형(type)
> 원소에 대한 접근&반복문 실행이 빨라짐 - 생성 시 선언한 size 동적 변경 불가 = 원소의 개수 변경X
> 처음에 (4, 4) 배열을 생성하면 > (5, 5) 등 다른 size로 바꿀 수가 없음 - 배열 연산 : 내부 반복문 사용 > 파이썬 반복문에 비해 속도가 빠름
> 파이썬 반복문 = 개별적으로 각각의 원소를 곱함
> 배열 연산 = 배열을 하나 더 복사 > 각각의 요소를 보낸 후(브로드캐스팅) 한번에 곱함 > 속도가 훨씬 빠름 - 간단한 코드로도 복잡한 선형 대수 연산 수행가능
ndarray 연산 특성
- 브로드캐스팅
: numpy에서 shape(크기)이 다른 배열 간에 연산을지원하기 위해 큰 배열 대상으로 작은 배열 여러번 연산(작은 배열 자동 반복 확장) - vectorized operation
: 반복문X 배열 간에 동일 위치에 데이터 항목 간에 연산이 한번에 처리(연산자, 함수로도 가능)
numpy 다차원 배열 (ndarray)
- array( [ 하나의 List ] ) 만 들어감 > ndarray 클래스 객채(배열)로 변환
- x = np.array([[[1, 2, 3, 4],
[5, 6, 7, 8]],
[[13,14,15,16],
[17,18,19,20]]]) - len(x) : 행(1차원) | 차원(다차원)의 개수 확인
- len(x[0]) : 열(1차원) | 행(다차원)의 개수 확인
- len(x[0][0]) : 열(다차원)의 개수 확인
numpy 확인 함수
- .rank / ndim() : 배열 차원
- .shape() : 각 차원의 크기, 배열의 크기를 튜플로 반환
- type(x) #<class 'numpy.ndarray'>
- type(list(x)) #<class 'list'> list로 변환도 가능
- .dtype()
: array()에 데이터 항목의 타입 선언(명시적 적용)
: 배열의 자료형 확인
: 부호가 있는 정수 int(8, 16, 32, 64) || 부호가 없는 정수 uint(8, 16, 32, 64)
|| 실수 float(16, 32, 64, 128) || 복소수 complex(64, 128, 256)
|| 불리언 boll || 문자열 String_ || 파이썬 오브젝트(객체) Object || 유니코드 Unicode_
ndarray 요소 접근 방법
- 배열의 인덱싱(integer indexing)
: a[[row1, row2], [col1, col2]] = ( a[row1, col1], a[row2, col2] )의 집합 - 배열 슬라이싱(부분집합)
: 최소 -최대 범위 지정 x[0, :] #첫번째 행 전체 - 팬시 인덱싱(fancy indexing)
- 정수배열객체 인덱싱
: 행, 열 순서 변경&선택된 배열 객체 반환
: 같은 원소 반복 지정 > 원래 배열보다 커지기도 함
- bool배열 객체 인덱싱
: DB의 질의(Query) 기능 > True, False로 표현
: 위치정보를 나타내는 원본 배열 집합과 또다른 배열 객체 반환
- 참고: https://rfriend.tistory.com/292
ndarray 생성 함수
- .array() = ndarray로 변환 <> .inarray() : list로 변환
- .arange() = 규칙에 따라 증가하는 수열을 만들어 numpy array 객체로 반환 / https://jimmy-ai.tistory.com/45
- np.zeros(배열객체, dtype=), zeros_like() = 배열 전체 원소 0인 배열 생성
- np.ones(배열객체, dtype=), ones_like() = 배열 전체 원소 1인 배열 생성
> _like = 튜플로 명시x 배열 생성 가능 - .eye() = 대각선 1, 나머지 0인 2차원 배열 생성
- .full() = 사용자가 지정한 값으로 배열 생성
- .empty() = 크기만 지정한 후 임의의 값이 채워짐
np.empty((2,2,3))
# [[[7.03592033e-312 2.47032823e-322 0.00000000e+000]
# [0.00000000e+000 0.00000000e+000 1.31370903e-076]]
# [[6.81519683e-091 4.27969694e-037 5.45035402e-067]
# [2.16696652e+184 3.99910963e+252 5.06037887e-038]]]
np.full((3,3),7)
# [[7 7 7]
# [7 7 7]
# [7 7 7]]
- .linspace(시작, 끝[포함], 개수) / .logspace(시작, 끝[포함], 개수) = 선형구간/로그 구간을 지정한 구간 수만큼 분할
- 전치함수, 행과 열을 바꾼 배열 생성
: 배열.T
: 배열.transpose()
: 배열.swapaxes(0,1)
: np.tranaspose(배열)
: np.swapaxes(배열, 0,1) - 난수(random number) 생성
- np.random.seed() = 시작숫자(출력결과고정)
- np.random.rand() = 0과 1사이의 균일분포 난수 발생
- np.random.randn() = 기댓값0, 표준편차1인 표준 정규분포를 따르는 난수 발생
- np.random.randint(low, high=None, size=None)= 균일분포 정수 난수
- np.random.shuffle() = 데이터 순서 변경(한 번 사용 시 변수값이 바뀜)
- np.random.choice(a, size=None, replace=True, p=None) = 집합에서 일부를 무작위 선택
- np.random.random() = 0과 1사이보다 작은 값의 균일분포 난수 발생
- np.random.uniform(low, high=, size=None) = 구간 사이 값을 균등분포 형태로 추출
- np.random.normal(loc=, scale=, size=) = 구간 사이 값을 정규분포 형태로 추출
- np.random.standard_normal(size=) = 기댓값0, 표준편차1인 표준 정규분포에서 난수 생성
> https://cosmosproject.tistory.com/447
ndarray 차원 변경 함수
- 무조건 1차원으로 바꿈
> .reshape() = 내부 데이터 보존한 채 새롭게 ndarray로 형태 변환
> .flatten() = 원본 copy (원본을 바꿔도 바뀌지 않음 / classification에서 1차원으로 변경시 자주 사용)
> .ravel() = 원본과 link 유지한 채로 1차원 배열로 변환(즉, 원본 바꾸면 같이 바뀜) - np.newaxis = np 배열의 1차원 증가시키는 함수 > https://daje0601.tistory.com/286
두 개이상의 ndarray 결합 함수
- hstack() = 수평 > 열의 수가 더 많은 배열 생성
- vstack() = 수직 > 행의 수가 더 많은 배열 생성
- dstack() = 안쪽 차원 증가 (단, 합치는 두 배열의 행과 열이 일치해야 함)
- stack() = 바깥쪽 차원 증가
> axis=0(디폴트) : 행을 기준으로 한 열씩 결합
> axis=1 : 열을 기준으로 한 행씩 결합 - 참고 : https://engineer-mole.tistory.com/234
- r_[ ] 메서드 = hstack과 비슷, 좌우 연결
- c_[ ] 메서드 = 차원 증가 후 좌우 연결
- tile() = 동일 배열 반복하여 연결
ndarray의 데이터 항목 빈도수 반환 함수
- .bincount(배열객체, return_counts) = 0 부터 minlength - 1 까지의 숫자 각각 카운트
- .unique(배열객체, return_counts) = 중복값 제거된 리스트 반환
> return_counts=지정하지 않으면 유니크한 값만 반환
ndarray 수학 함수
- add() 더하기 | substract() 빼기 | multiply() 곱하기| divide() 나누기
- dot() = 행렬과 행렬의 곱 > class 'numpy.ndarray' 반환 (행렬곱 연산자= @, 3.5버전 이상부터 사용 가능 )
- prod() = 한 행렬 안의 각 배열 요소들을 곱하는 함수 > class 'numpy.int32' 반환
- abs() = 절대값
- sqrt() = 제곱근(배열객체 **0.5)
- square() = 제곱
- exp() = 밑이 자연상수e 의 지수로 계산한 값을 반환
- log() = 자연로그
- log10() = 사용로그
- log2() = 밑이 2인 로그
- cos, cosh, sin, sinh, tan, tank = 코싸인, 싸인, 탄젠트 계산 함수
- ceil() = 올림
- floor() = 버림
- all() = 배열의 모든 원소 동일 시 True, 하나라도 다르면 False 반환 <> any() : 하나라도 True면 True
- sign() = 양수이면 1, 음수이면 -1 0이면 0을 반환(부호 계산)
- .inf(infinity) = 무한대
- .nan(not a number) = 정의할 수 없는 숫자 ≒ null
- isnan() = 데이터 항목들에서 NaN(숫자가 아님)이면 True, 아니면 False 반환
- isinf() = 데이터 항목들에서 무한대이면 True, 아니면 False 반환
- https://ffoorreeuunn.tistory.com/361
ndarray 정렬함수
- sort(배열객체, axis=) : https://rfriend.tistory.com/357
- 배열객체.argsort() : 주어진 하나 이상의 숫자(Key)를 기준으로 데이터 정렬
import numpy as np
np.random.seed(2)
#2차원 배열 생성
matrix = np.round(np.random.randn(5,5), 2)
print('랜덤으로 생성된 2차원 배열: \n', matrix)
#기준이 되는 1차원 배열 생성
vector = np.array([5,3,1,2,4])
#matrix 배열에 첫 번째 열에 vector 배열의 요소값을 넣어줌
matrix[0]=vector
print('matrix 배열에 첫번째 열에 vector 배열의 요소 값 대입 \n', matrix)
print('argsort()로 정렬한 배열 \n', matrix[:, matrix[0].argsort()])
랜덤으로 생성된 2차원 배열:
[[-0.42 -0.06 -2.14 1.64 -1.79]
[-0.84 0.5 -1.25 -1.06 -0.91]
[ 0.55 2.29 0.04 -1.12 0.54]
[-0.6 -0.02 1.18 -0.75 0.01]
[-0.88 -0.16 0.26 -0.99 -0.34]]
matrix 배열에 첫번째 열에 vector 배열의 요소 값 대입
[[ 5. 3. 1. 2. 4. ]
[-0.84 0.5 -1.25 -1.06 -0.91]
[ 0.55 2.29 0.04 -1.12 0.54]
[-0.6 -0.02 1.18 -0.75 0.01]
[-0.88 -0.16 0.26 -0.99 -0.34]]
argsort()로 정렬한 배열
[[ 1. 2. 3. 4. 5. ]
[-1.25 -1.06 0.5 -0.91 -0.84]
[ 0.04 -1.12 2.29 0.54 0.55]
[ 1.18 -0.75 -0.02 0.01 -0.6 ]
[ 0.26 -0.99 -0.16 -0.34 -0.88]]
ndarray 통계함수
- 함수의 선택옵션 axis = 0(defult, 열), 1(행) 기준으로 계산
- min(), max() = 최솟값/최댓값
- argmin(), argmax() = 최솟값/최댓값의 위치 반환
- mean() = 평균
- sum() = 합계
- median() = 중앙값(짝수이면 가장 가운에 있는 두 수의 평균 반환)
- std() = 표준편차
- var() = 분산
- percentile(배열객체, [0,25,50,75,100]) = 최소값 / 1사분위수 / 2사분위수 / 3사분위수 / 최댓값 반환
- cumsum() = 누적합
- cumprod() = 누적곱
- https://nittaku.tistory.com/108
ndarray 집합연산
- np.intersect1d() = 교집합 반환
- np.setdiff1d() = 차집합 반환
> https://rfriend.tistory.com/355
참고링크
Introduction to NumPy
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
Python Numpy Tutorial (with Jupyter and Colab)
This tutorial was originally contributed by Justin Johnson. We will use the Python programming language for all assignments in this course. Python is a great general-purpose programming language on its own, but with the help of a few popular libraries (num
cs231n.github.io
08 Input and Output
[TOC] ## save, load Save the following script file as `test0.py` and run. ```python import nu ...
wikidocs.net
* 추가 내용참고&출처 : 태그의 수업을 복습 목적으로 정리한 내용입니다.