Numpy 정리

이서영·2023년 8월 10일
0

python

목록 보기
2/3

1. Numpy란

  • Numpy는 c언어로 구현된 파이썬 라이브러리
  • 고성능의 수치연산
  • 행렬/배열 처리 및 연산
  • 기본적으로 arrary 단위로 데이터를 관리하며 연산 수행
  • 하나의 타입으로만 이루어져 있다.
  • 타입은 ndarray이다.

array와 ndarray의 차이

  • 데이터를 효율적인 고정 타입 데이터 버퍼에 저장하는 다양한 방식을 제공하는데 파이썬 3.3부터 제공하는 array라는 내장 모듈이 그 중 하나.

  • 파이썬 내장 모듈인 array 모듈은 데이터에 효율적인 저장소만을 제공해주는 반면, numpy는 효율적인 저장소를 제공할 뿐만 아니라 효율적인 연산도 가능하게 해준다.


1-1. Numpy 기초

i) array 정의 및 사용

  • 정의
import numpy as np
np.array(생성할 데이터, 데이터 타입)

##예시
a = [[1,2,3],[4,5,6]] #리스트에서 생성
arr1= np.array(a)          # numpy로 배열 정의
print(arr1)
>[[1 2 3]
 [4 5 6]]

ii) 행렬의 차원과 크기

print(arr1.shape)  # 차원. 크기를 확인할때 사용

>(2,3)
  • 행렬의 차원변환

a=np.arange(6)
print(a)
> [ 0 1 2 3 4 5 ]

a = a.reshape((3,2))   #차원 변환
print(a)
>[[0 1]
  [2 3]
  [4 5]]
  
  • reshape는 지정된 사이즈로 변경 불가능 하면 오류 발생
    • (10,)인 데이터를 (4,3) 으로 변환 불가
      -> 실전에서는 인자를 -1 로 적용하는 경우가 있음
array1 = np.arange(10)
print(array1)

array2 = array1.reshape(-1, 5)
print('array2.shape :', array2.shape)

array3 = array1.reshape(5, -1)
print('array3.shape :', array3.shape)
>[0 1 2 3 4 5 6 7 8 9]
array2.shape : (2, 5)
  • 하지만 -array1 = np.arange(10)
    array4 = array1.reshape(-1, 4) 이러한 경우에는 오류를 발생하는데 보통은 reshape(-1,1) 같은 형태로 사용된다
  • reshape(-1, 1)은 원본 ndarray가 어떤 형태라도 2차원이고,
    여러 개의 로우를 가지되 반드시 1개의 컬럼을 가진 ndarray로 변환됨을 보장
array1 = np.arange(8)
array5 = array3d.reshape(-1, 1)
>  [[0], [1], [2], [3], [4], [5], [6], [7]]

iii) 행렬의 타입

  • ndarray 내의 데이터 값은 숫자값 문자열 값, 불 값등이 모두 가능
  • ndarray 내의 데이터 타입은 그 연산의 특성상 같은 데이터 타입만 가능
  • 여러 개의 넘파이 ndarray는 stack이나 concat으로 결합할 때 각각의 ndarray의 형태를 통일해 유용하게 사용
print(arr2.dtype)  # 타입 확인
>(int64)  # 앞에는 자료형을 의미하며 뒤에는 메모리를 의미한다.
# 타입 변경
array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64')

iii) 인덱싱

# 1차원
print(arr1[0,0])  #원소 접근법 행,열의 원소에 접근한다.
> 1
# 2차원
array2d:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
print(array2d[0:2, 0:2])
>  [[1 2]
 [4 5]]
## 펜시 인덱싱 - 인덱스 집합을 지정하면 해당 위치의 인덱스에 해당하는 ndarray를 반환

array1d = np.arange(1, 10)
array2d = array1d.reshape(3, 3)
print(array2d[[0, 1], 0:2])
>[[1 2]
 [4 5]]

### 불린 인덱싱 - 조건필터링과 검색을 동시 사용
array1d = np.arange(1, 10)
print(array1d[array1d>5])
[6 7 8 9]

iv) 정렬

  • 넘파이의 행렬 정렬은 np.sort()와 같이 넘파이에서 sort()를 호출하는 방식과
    ndarray.sort()와 같이 행렬 자체에서 sort()를 호출하는 방식이 있다
  • 두 방식의 차이는 np.sort()의 경우 원 행렬은 그대로 유지한 채 행렬의 정렬된 행렬을 반환
  • ndarray.sort()는 원 행렬 자체를 정렬한 형태로 변환하며 변환된 값은 None임
### 1차원
org_array = np.array([3, 1, 9, 5])
print('원본 행렬 :', org_array)

# np.sort()로 정렬
sort_array1 = np.sort(org_array)
print('np.sort() 호출 후 반환된 정렬 행렬 :', sort_array1)
print('np.sort() 호출 후 원본 행렬 :', org_array)

# ndarray.sort()로 정렬
sort_array2 = org_array.sort()
print('org_array.sort() 호출 후 반환된 행렬 :', sort_array2)
print('org_array.sort() 호출 후 원본 행렬 :', org_array)
### 2차원
array2d = np.array([[8, 12],
                    [7, 1]])

sort_array2d_axis0 = np.sort(array2d, axis=0)
print('로우 방향으로 정렬 :\n', sort_array2d_axis0)

sort_array2d_axis1 = np.sort(array2d, axis=1)
print('칼럼 방향으로 정렬 :\n', sort_array2d_axis1)

v) 특수한 행렬


print(np.arange(10))     # 1~9까지의 1차원 배열 생성 list의 range
> [0 1 2 3 4 5 6 7 8 9]

np.eye(N=3, M=5,           # 총 행렬의 크기는 3x5
               k=1,           # identity matrix의 시작은 1열부터 시작하라 
			   dtype=np.int8)
array([[0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0]], dtype=int8)
###대각 행렬이라고 하며 어떤 행렬을 곱하더라도 해당 행렬이 출력되도록
print(np.zeros((2,2)))   # 영행렬 생성 (0으로 가득찬 행렬)
> [[0. 0.]               # 타입이 float
    [0. 0.]]
### 0으로 초기화된 shape 차원의 ndarray 배열 객체 반환    
print(np.ones((2,2)))    # 유닛행렬 생성 (1로 가득찬 행렬)
> [[1. 1.]               # 타입이  float
    [1. 1.]]
### 1로 초기화된 shape 차원의 ndarray 배열 객체 반환

print(np.full((2,2),5)   # 모든 원소가 5인 행렬
### 모든 값을 지정한 수로 초기화된 shape 차원의 ndarray 배열 객체 반환

>print(np.empty((2,2)))  # 
> [[0. 0.]               # 안에 수는 다른 쓰레기 수가 들어가 있을수 있음
    [0. 0.]]
### 모든 값을 초기화되지 않은 shape 차원의 ndarray 배열 객체 반환   

vi)Numpy자료형

  • 부호가 있는 정수 int(8, 16, 32, 64)
  • 부호가 없는 정수 uint(8 ,16, 32, 54)
  • 실수 float(16, 32, 64, 128)
  • 복소수 complex(64, 128, 256)
  • 불리언 bool
  • 문자열 string_
  • 파이썬 오프젝트 object
  • 유니코드 unicode_

2. Numpy 연산

2-1. 사칙연산

a = np.array([1,2,3])
b = np.array([4,5,6])
### 더하기
d= np.add(a, b)       # c = a+b와 같다
print(d)
>[5 7 9]

###뺴기
d= np.subtract(a, b)  # c= a-b와 같다.
print(d)
>[-3 -3 -3]

###곱하기
d= np.multiply(a, b)  # c= a*b와 같다
print(d)              
>[ 4 10 18]

###나누기
d= np.divide(a, b)    # c= a/b와 같다
print(d)

###2차원일 경우
arr = np.array([[1,2,3],[4,5,6]])
arr1 = np.array([[7,8,9],[10,11,12]])
d= np.add(arr, arr1)
print(d)
>[[ 8 10 12]
 [14 16 18]]

2-2 기본 수학함수

functionDescription
abs,fabsarray요소 단위로 절대값 반환
sqrtarray요소 단위로 음아 아닌 절대값 반환
squarearray요소 단위로 제곱 반환
expexponential 값 반환
log,log10입력 array의 로그 값 반환
sign숫자의 부호 반환
cos,cosh,sin삼각함수

2-3 선형대수(벡터/행렬 연산)함수

functionDescription
diaginput이 2차원 행렬 : 대각 원소만을 추출해 1차원 배열로 반환
또한 k를 지정해 k칸 치우친 방향의 대각성분도 획득 가능
1차원 행렬일 경우 input값을 차례대로 가지는 대각행렬 생성
dot1차원 :두 array의 내적을 계산
2차원 : 행렬곱 반환
tracesum of the diagonal elements
detmatrix determinant
eigeigenvalues and eigenvectors of a square matrix
invinverse of a square matrix
pinvMoore-Penrose pseudo-inverse of a matrix
qrQR decomposition
## 내적 : 1 x 1 차원
a = np.array([1, 3, 5])
b = np.array([4, 2, 1])
np.dot(a, b)
> 15
#    element-wise 방식으로 각 원소를 곱한 값들을 더한 내적 연산 수행
#    참고로 행렬의 원소 개수가 일치해야된다.

## 행렬 곱 : 2 x 2차원
a = np.array([[1, 3], [2, 4]])
b = np.array([[1, 6], [3, 0]])
print(np.dot(a, b))
>[[10  6]
 [14 12]]
# 행렬곱
  • 행렬 곱셈(matrix multiplication)은 두 개의 행렬에서 한 개의 행렬을 만들어내는 이항연산이다. 결과로 만들어진 행렬은 행렬곱이라 한다.
profile
전공자 학생

0개의 댓글

관련 채용 정보