행렬을 쓰는 이유, Numpy 개인 공부 [2023-04-12 학습일지]
★ 왜 행렬?
행렬은 영어로 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)
추후 공부하는대로 더 정리하면 올리겠습니다.
감사합니다.