넘파이의 핵심 데이터 구조는 다차원 배열이다
벡터 만들기
import numpy as np
# 행이 하나인 벡터
vector = np.array([1, 2, 3])
# 열이 하나인 벡터
vector = np.array([[1], [2], [3]])
# 넘파이 배열은 ndarray 클래스의 객체
print(type(vector))
<class 'numpy.ndarray'>
# ndarray 클래스의 첫 번쨰 매개변수에 배열 크기를 정수 튜플로 지정하여 넘파이 배열 생성가능
# 권장하는 방법은 아님
vector = np.ndarray((3,))
# asarray 함수를 사용하여 배열을 만드는 방법도 가능, 단 입력이 넘파이 배열일 때는 새로운 배열을 생성하지 않음
vector = np.asarray([1, 2, 3])
행렬 만들기
import numpy as np
# 2차원 배열을 이용해 행렬 만들기
matrix = np.array([[1, 2], [1, 2], [1, 2]])
# empty 함수는 초깃값 대신 크기만 지정하여 임의의 값이 채워진 배열 생성
e_matrix = np.empty((3, 2))
# zeros 는 0으로 채운 배열을 생성, ones 는 1로 채운 배열을 생성
zero_matrix = np.zeros((2, 2))
zero_matrix
array([[0., 0.], [0., 0.]])
one_matrix = np.ones((2, 2))
one_matrix
array([[1., 1.], [1., 1.]])
# 7로 채운 행렬
matrix = np.zeros((2, 2)) + 7
matrix
array([[7., 7.], [7., 7.]])
# 특정 값으로 채운 배열을 만들려면 full을 사용\
matrix = np.full((3, 2), 7)
matrix
array([[7., 7.], [7., 7.]])
희소 행렬 만들기
-> 희소 행렬은 0이 아닌 원소만 저장
import numpy as np
from scipy import sparse
# 행렬 만들기
matrix = np.array([[0, 0], [0, 1], [3, 0]])
# 희소 행렬로 변환
sparse_matrix = sparse.csr_matrix(matrix)
print(sparse_matrix)
(1, 1) 1
(2, 0) 3
(1, 1) 1
(2, 0) 3
의 의미는 1행 1열에 1, 2행 0열에 3의 데이터가 저장되어 있다는 의미이다.
희소행렬을 밀집 배열로 변환하기
# (data, (row_index, col_index))로 구성된 튜플을 전달
# shape 매개변수에서 0을 포함한 행렬의 전체 크기를 지정
matrix = sparse.csr_matrix(([1, 3], ([1, 2], [1, 0])), shape=(3, 10))
print(matrix)
(1, 1) 1
(2, 0) 3
# 희소 행렬을 밀집 배열로 변환하려면 toarray 메소드 사용
print(matrx.toarray())
[[0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[3 0 0 0 0 0 0 0 0 0]]
# todense 메소드는 np.matrix 객체를 반환
matrix.todense()
matrix([[0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[3 0 0 0 0 0 0 0 0 0]], dtype=int64)
원소 선택하기
import numpy as np
# 행 벡터 생성
vector = np.array([1, 2, 3, 4, 5, 6])
# 3 X 3 행렬 생성
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
vector[2]
3
matrix[1, 1]
5
# 모든 원소 선택
vector[:]
array([1, 2, 3, 4, 5, 6])
# 여러가지 슬라이싱 방법
vector[:3]
array([1, 2, 3])
vector[3:]
array([4, 5, 6])
vector[-1]
6
matrix[:2, :]
array([[1, 2, 3], [4, 5, 6]])
matrix[:, 1:2]
array[[2], [5], [8])
marix[[0, 2]]
array([[1, 2, 3], [7, 8, 9]])
matrix[[0,2], [1, 0]]
array([2, 7])
mask = matrix > 5
mask
array([[False, False, False], [False, False, True], [True, True, True]])
matrix[mask]
array([6, 7, 8, 9])
행렬 정보 확인하기
import numpy as np
matrix = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 행렬 크기 확인
matrix.shape
(3, 4)
# 행렬 원소 개수 확인
matrix.size
12
# 차원 수 확인
matrix.ndim
2
# 원소의 데이터 타입 확인
matrix.dtype
int64
# 원소 하나가 차지하는 바이트 크기 확인
matrix.itemsize
8
# 배열 전체가 차지하는 바이트 크기 확인
matrix.nbytes
96
행렬 벡터화 연산
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 10을 더하는 함수 생성
add_10 = lambda i : i +10
# 벡터화된 함수 생성
vectorized_add_10 = np.vectorized(add_10)
# 벡터화된 함수 생성
vectorize_add_10(matrix)
array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
# 모든 원소에 10 더하기
matrix + 10
array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
# 행을 따라 더하기 진행
matrix + [10, 10, 10]
array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
# 열을 따라 더하기 진행
matrix + [[10], [10], [10]]
array([[11, 12, 13], [14, 15, 16], [17, 18, 19]])
최대, 최소값 찾기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#최댓값
np.max(matrix)
9
#최솟값
np.min(matrix)
1
#각 열의 최대, 최솟값
np.max(matrix, axis=0)
array([7, 8, 9])
np.min(matrix, axis=0)
array([1, 2, 3])
#각 행의 최대, 최솟값
np.max(matrix, axis=1)
array([3, 6, 9])
np.min(matrix, axis=1)
array([1, 4, 7])
평균, 분산, 표준편차 구하기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#평균
np.mean(matrix)
5.0
# 분산
np.var(matrix)
6.66666666667
# 표준편차
np.std(matrix)
2.581988897471611
배열 크기 변경
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
# 2 X 6 행렬로 크기 변경
matrix.reshape(2, 6)
array([[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]])
# 행 하나에 열은 가능한 많이
matrix.reshape(1, -1)
array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]])
# 정수 하나 입력시 그 길이의 1차원 배열 반환
matrix.reshape(12)
array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]])
# ravel 메소드
matrix.ravel()
array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]])
행렬 전치하기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 행렬 전치하기
matirx.T
array([[1, 4, 7], [2, 5, 7], [3, 6, 9]])
# 행 벡터 전치하기
np.array([[1, 2, 3, 4, 5, 6]]).T
array([[1], [2], [3], [4], [5], [6]])
# transpose 메서드 사용하기
# transpose 메서드는 튜플로 바꿀 차원을 직접 지정가능
matrix = np.array([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]])
# 두 번째와 세 번째 차원을 바꾸어 2 X 2 X 3 행렬로 만들기
matrix.transpose((0, 2, 1))
array([[[1, 3, 5], [2, 4, 6]], [[7, 9, 11], [8, 10, 12]]])
행렬 펼치기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#행렬 펼치기
matrix.flatten()
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
행렬의 랭크 구하기
-> 행렬의 랭크란 행이나 열이 만든 벡터 공간의 차원
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.linalg.matrix_rank(matrix))
2
행렬식 계산하기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.linalg.det(matrix))
0.0
대각원소 추출하기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix.diagonal())
array([1, 4, 9])
대각합 계산하기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix.trace())
14
# 주 대각선 하나 위의 대각원소의 합을 반환
matrix.trace(offset=1)
# 주 대각선 하나 아래의 대각원소의 합을 반환
matrix.trace(offset=-1)
고윳값과 고유벡터 찾기
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#고윳값과 고유벡터 계산
eigenvalues, eigenvectors = np.linalg.eig(matrix)
# 고윳값 확인
print(eigenvalues)
[ 1.61168440e+01 -1.11684397e+00 -1.30367773e-15]
# 고유벡터 확인
print(eigenvectors)
[[-0.23197069 -0.78583024 0.40824829]
[-0.52532209 -0.08675134 -0.81649658]
[-0.8186735 0.61232756 0.40824829]]
점곱 계산하기
import numpy as np
vector_a = np.array([1, 2, 3])
vector_b = np.array([4, 5, 6])
# 점곱 계산
print(np.dot(vector_a, vector_b))
32
행렬 덧셈과 뺄셈 곱셈
import numpy as np
matrix_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix_b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 행렬 덧셈 계산
print(np.add(matrix_a, matrix_b))
[[ 2 4 6]
[ 8 10 12]
[14 16 18]]
# 행렬 뺄셈 계산
print(np.subtract(matrix_a, matrix_b))
[[0 0 0]
[0 0 0]
[0 0 0]]
# 행렬 곱셈 계산
print(np.dot(matrix_a, matrix_b))
[[ 30 36 42]
[ 66 81 96]
[102 126 150]]
역행렬
import numpy as np
matrix = np.array([[1, 4], [2, 5]])
# 역행렬 계산
print(np.linalg.inv(matrix))
[[-1.66666667 1.33333333]
[ 0.66666667 -0.33333333]]
'프로그래밍 > 파이썬' 카테고리의 다른 글
판다스(Pandas) 사용하기 (0) | 2021.06.21 |
---|---|
파이썬으로 웹 크롤링하기(3) 동적 페이지 (0) | 2021.03.23 |
파이썬으로 웹 크롤링하기(2) 데이터 변환 (0) | 2021.03.22 |
파이썬으로 웹 크롤링 하기(1) 정적인 웹 페이지 (0) | 2021.03.22 |
2. 파이썬 자료구조 튜플 (0) | 2021.02.17 |