본문 바로가기

프로그래밍/파이썬

numpy 사용하기 벡터, 행렬, 배열

넘파이의 핵심 데이터 구조는 다차원 배열이다

 

벡터 만들기

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]]