본문 바로가기

Deep Learning

[Deep Learning] 220727 학습일기

 

밑바닥부터 시작하는 딥러닝 - YES24

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서 이 책은 라이브러리나 프레임워크에 의존하지 않고, 딥러닝의 핵심을 ‘밑바닥부터’ 직접 만들어보며 즐겁게 배울 수 있는 본격 딥

www.yes24.com

 

1.

import numpy as np
A = np.array([[1, 2],[3, 4],[5, 6]])
print(A)
print(A.shape)
print(A.dtype)

<출력값>

[[1 2]
 [3 4]
 [5 6]]
(3, 2)
int32

3X2 배열을 입력하면 shape(배열의 형상. 즉 행렬을 포함한 N차원 배열에서 그 배열의 각 차원의 크기)가 (3,2)라고 출력된다.

 

 

2.

import numpy as np
A = np.array([[1,2],[3,4]])
B = np.array([[3,0],[0,6]])
print(A+B)

<출력값>

[[ 4  2]
 [ 3 10]]

 

 

3.

넘파이 배열에서는 두 배열의 형상(shape)이 같아야만 곱도 할 수 있다.

import numpy as np
A = np.array([[1,2],[3,4]])
B = np.array([[3,0],[0,6]])
print(A*B)

<출력값>

[[ 3  0]
 [ 0 24]]

 

이때 행렬의 곱과는 방식이 다르다.

원소별로 각각 곱해진다.

 

상수 a,b,c,d,e,f,g,h가 있다고 할 때

import numpy as np
A = np.array([[a,b],[c,d]])
B = np.array([[e,f],[g,h]])

라면 A*B는

[[a*e b*f]

[c*g d*h]]

이다.

두 행렬의 곱과는 다르다는 것을 느낄 것이다.

 

 

(3x2) 행렬과 (2x2)행렬은 행렬의 곱을 통해 계산이 가능하지만 넘파이 배열에서는 곱의 방식이 원소별(elementwise)이기 때문에 넘파이 배열에서는 곱이 이루어지지 않는다.

import numpy as np
A = np.array([[1,2],[3,4],[5,6]])
B = np.array([[3,0],[0,6]])
print(A*B)

<출력값>

Traceback (most recent call last):
  File "c:\Users\tina0\Desktop\python 실습들\Deep Learning-밑시딥\1.5 .py", line 31, in <module>
    print(A*B)
ValueError: operands could not be broadcast together with shapes (3,2) (2,2)

 

 

4.

import numpy as np
A = np.array([[1,2],[3,4]])
print(A*10)

배열에 스칼라값 10을 곱하면 각각의 원소에 10이 곱해진다.

 

넘파이에서는 형상이 다른 배열끼리도 계산할 수 있다.

위에서와 같이 2x2행렬에 스칼라값인 10을 곱하는 것이 그것의 예시이다.

2x2 행렬에 스칼라값인 10이 곱해질 때에는 스칼라값이 2x2 행렬로 확대된 후 연산이 이루어진다.

이 기능을 브로드캐스트 라고 한다.

 

 

5.

넘파이 배열은 N차원 배열을 작성할 수 있다.

수학에서 

1차원 배열은 벡터(vector)

2차원 배열은 행렬(matrix)

그리고 벡터와 행렬을 일반화한 것을 텐서(tensor) 이라고 한다.

 

 

6.

브로드캐스트는 이렇게도 가능하다.

import numpy as np
A = np.array([[1,2],[3,4]])
B = np.array([[10,20]])
print(A*B)

<출력>

[[10 40]
 [30 80]]

 

여기서는 B가 곱해지면서

[[10 20]
 [10 20]]

으로 확대된 것이다.

 

 

7. 인덱스

 

array A의 0행 찾기

import numpy as np
A = np.array([[1,2], [10,21], [12,60]])
print(A[0])

<출력값>

[1 2]

 

 

array A의 (0,1) 찾기

이중 인덱싱으로 해주면 된다.

import numpy as np
A = np.array([[1,2], [10,21], [12,60]])
print(A[0][1])

<출력값>

2

 

 

8.

import numpy as np
A = np.array([[1,2], [10,21], [12,60]])
for row in A:
    print(row)

<출력값>

[1 2]
[10 21]
[12 60]

 

 

9. 평탄화(flatten)

import numpy as np
A = np.array([[1,2], [10,21], [12,60]])
Af = A.flatten()
print(Af)
print(type(Af))

<출력값>

[ 1  2 10 21 12 60]
<class 'numpy.ndarray'>

 

 

 

배열_이름.flatten()

을 이용하면 어떤 배열을 1차열 배열로 변환할 수 있다.(평탄화)

 

그리고 flatten 시켰을 때의 배열(여기서는 Af)은 원래 배열(A)와 동일하게 type이 numpy.ndarray이다.

 

 

10.

anaconda prompt는 Visual Studio Code와는 조금 다르다.

Visual Studio Code에도 여기서와 같이 print를 명령하지 않고도 출력할 수 있는 방법이 있을까?

모르겠다..

 

 

11. 인덱스가 n1,n2,n3인 원소 얻기

import numpy as np
A = np.array([[1,2], [10,21], [12,60]])
Af = A.flatten()
print(Af)
print(Af[np.array([0,2,4])])

<출력값>

[ 1  2 10 21 12 60]
[ 1 10 12]

이렇게 배열 Af에서 인덱스가 0,2,4인 원소를 얻을 수 있다.

다만 일반 리스트에서 인덱스하는 방법과는 달라서 조금 헷갈린다.

배열 만드는 방법으로 인덱스를 한다

'Deep Learning' 카테고리의 다른 글

[Deep Learning] 220805 학습일기  (0) 2022.08.05
[Deep Learning] 220803 학습일기  (0) 2022.08.03
[Deep Learning] 220730 학습일기  (0) 2022.07.30
[Deep Learning] 220729 학습일기  (0) 2022.07.30
[Deep Learning] 220721 학습일기  (0) 2022.07.23