언어/Python

행렬을 쓰는 이유, Numpy 개인 공부 [2023-04-12 학습일지]

플광 2023. 5. 29. 10:23

 

 

★ 왜 행렬?

행렬은 영어로 Matrix, 왜 쓰는지 찾아보면, 연립 방적식의 해를 구하는데 좋다.. 어쩔때 좋다.. 등등 쓰는 이유가 많다. 하지만, 우리가 처한 상황에서 이해하기 좋으려면, 매우 많이 쓰고 달리 대체할 도구가 없기 때문이다.

 

0 0 1 0 0

0 1 0 1 0

1 0 0 0 1

0 1 0 1 0

0 0 1 0 0

 

단순한 5x5 행렬이다. 무엇으로 보이는가? just text?

그러면 이번엔 칸에 색을 칠해보자.

 

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가

























모양이 나타난다.

 

그러면, 0과 1 대신에 크기의 개념을 집어넣으면? 어떻게 표현할 수 있을까?

 

0 0 3 0 0

0 2 0 5 0

2 0 1 2 3

0 5 0 2 0

0 0 3 0 0

 


























아 그러면, 지금은 불분명하니까 적당히 2 이하는 0처리, 3이상은 5처리 해줘.

 

0 0 5 0 0

0 0 0 5 0

0 0 0 0 5

0 5 0 0 0

0 0 5 0 0

 

























이렇게 되면, 적당히 의미 있는 값들과 의미 없는 값들이 구분되어진다.

 

포토샵에서 마스킹(masking), 샤픈(sharpen)이나 블러(blur)를 써본 사람은 어떤 느낌인지 올 것이다.

 

여기 영역만 쓰던가, 적당히 주변값과 대비되어지거나, 주변 값과 비슷해지거나..

 

이처럼 이미지와 행렬은 큰 연관이 있다.

 

비단 이미지 뿐만이 아니다. 영상, 소리, 전기 신호, 지리, 위치 등 표현할 수 있는 수단이 많다.

 

추후에 관심이 있는 사람은 '행렬과 차원의 관계'에 대해서 더 알아보길 권한다.

 

 

 Numpy를 쓰는 이유 :

Python 기본 제공 list 대비 numerical 자료에 대해 빠르고 효과적으로 넓게 사용가능한 배열을 만들어줌. 또한, python의 list는 다양한 자료형을 받아들이지만, numpy는 모두 같은 타입(실수형만 또는 정수형만)의 배열을 만들고, 그 타입을 제한한다. (값 타입을 제한함으로써 속도와 안정성이 올라감)

 

■ 만들기 과정

 

※ 직접 list를 넣을 때

 

※ 0 또는 특정 수로 채우고, 사이즈 결정만 하고 싶을 때

np.zeros(2)

np.ones(2)

np.empty(2)

 

※ 특정 범위 수로 채울 건데, 내가 정한 크기 기준으로 값을 넣고 싶을 때

>> np.arange(2, 9, 2)

array([2, 4, 6, 8])

 

※ 특정 범위 수로 채울 건데, 내가 정한 개수 기준으로 값을 넣고 싶을 때

>> np.linspace(0, 10, num=5)

array([ 0. , 2.5, 5. , 7.5, 10. ])

 

 

 

※ 데이터 자료형 크기 변경하고 싶을 때

x = np.ones(2, dtype=np.int64) int16, int32, int64, float16, float32, float64

array([1, 1])

print(x.dtype) #int64

 

 

■ 데이터 변경

※ 오름차순 정렬할 때

arr = np.array([2, 1, 5, 3, 7, 4, 6, 8])
np.sort(arr)
 
[1, 2, 3, 4, 5, 6, 7, 8]
 

 

 

※ 행렬 연결(extend 개념)

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
np.concatenate((a, b))
 
[1, 2, 3, 4, 5, 6, 7, 8]
 

결과 : array([1, 2, 3, 4, 5, 6, 7, 8])

 

※ 행렬 상태 확인

array_example = np.array([[[0, 1, 2, 3],
[4, 5, 6, 7]],
[[0, 1, 2, 3],
[4, 5, 6, 7]],
[[0 ,1 ,2, 3],
[4, 5, 6, 7]]])
 
>> array_example.ndim
3
>> array_example.size
24
>> array_example.shape
(3, 2, 4)
 

 

※ 행렬 형태 변경(convert)

a = np.arange(6)
b = a.reshape(3, 2)
 
 [[0 1]
 [2 3]
 [4 5]]
 

 

※ 행 추가, 열 추가

a = np.array([1,2,3,4,5,6])
a2 = a[np.newaxis, :] # 행추가
a3 = a[:, np.newaxis] # 열추가
print(a.shape)
print(a2)
print(a2.shape)
print(a3)
print(a3.shape)
 
(6,)
[[1 2 3 4 5 6]]
(1, 6)
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
(6, 1)
 

추후 공부하는대로 더 정리하면 올리겠습니다.

 

감사합니다.