<gh_stars>1-10
#3) 다차원 배열의 계산


#######KEYWORD########





######################

#다차원 배열이란 숫자를 한줄(1차원), 혹은 직사각형이나 정사각형(2차원), 정육면체나 직육면체(3차원), 혹은 그 이상의 N차원으로 나열하는 것을 통틀어
#다차원 배열이라고 한다. 파이썬의 Numpy 라이브러리를 이용하면 다차원 배열을 사용할 수 있다.
#아래 코드는 여태까지 사용했던 1차원 배열이다.


import numpy as np
#1차원 배열
A = np.array([1,2,3,4])
print(A)
np.ndim(A) #몇차원배열?
A.shape #배열의 모양을 튜플로 반환하는 메소드
A.shape[0]

#2차원 배열
A=np.array([[1,2],[3,4],[5,6]])
print(A)
np.ndim(A)
A.shape #3행 2열

#1차원 배열은 벡터라고 한다. 벡터는 방향과 크기의 의미를 모두 포함하는 타입으로 스칼라 값들을 순서대로 가진다.
#2차원 배열에서 볼 수 있듯이 2차원 배열은 행렬과 동일한 형태를 가진다.
#이는 2차원 배열간 연산에 행렬 연산을 할 수 있다는 것을 의미한다.
#행렬의 내적, 역행렬 등등 중요한 행렬 연산들을 numpy array를 통해 할 수 있다.

#파이썬으로 행렬 내적을 하는 방법은 다음과 같다.
A=np.array([[1,2],[3,4]])
B=np.array([[5,6],[7,8]])

#행렬내적을 해주는 numpy 메소드 dot() (행렬곱)
np.dot(A,B)

#행렬 내적을 하기 위해선 좌측 행렬의 열과 우측 행렬의 행이 같아야만 한다.
#예를 들면 (3,2) 행렬과 (2,3) 행렬은 좌측 행렬의 열이 2, 우측 행렬의 행이 2로 같으므로 행렬곱이 가능하고 결과로 (3,3) 행렬이 출력된다.
#또한 (2,3) 행렬과 (3,2) 행렬은 행렬곱을 하면 (2,2) 행렬이 출력된다. 좌측 행렬의 열과 우측 행렬의 행이 같지 않다면
#dot() 메소드를 사용했을 때 shape이 같지 않다는 에러가 출력된다.

#이 규칙은 차원이 다른 배열간의 내적을 구할때도 적용된다. 2차원 배열인 (3,2)행렬과 1차원 배열인 (2)는 내적이 가능하며
#결과로 1차원 배열이 출력된다. 1차원 배열은 위 파이썬 코드에서도 확인 했듯이 (2,) 형태이기 떄문.

import numpy as np
A = np.array([[1,2],[3,4],[5,6]])
B = np.array([7,8])
A.shape
B.shape
np.dot(A,B)
np.dot(A,B).shape

#2차원 배열인 행렬과 1차원 배열인 벡터간 행렬곱을 확인 할 수 있다.
#이러한 행렬곱이 중요한 이유는 신경망에서 입력값과 가중치의 곱의 합을 통한 활성함수 계산이 용이하기 때문.
#이를 간단한 수식으로 확인하면 P33. 그림23
#           1  3  5
# (x1  x2)(         ) = (y1 y2 y3)
#           2  4  6

#입력층과 출력층 그리고 가중치는 위의 행렬곱으로 표현할 수 있다.
#여기서 주의해야할 점은 각 곱의 차원의 원소수가 같아야 한다는 점.
#이를 파이썬으로 계산해보면 아래와 같다.
X=np.array([1,2])
W=np.array([[1,3,5],[2,4,6]])
Y=np.dot(X,W)
print(Y) # 5 11 17

#이처럼 다차원 배열을 이용하면 아무리 신경망 구조가 복잡하더라도 행렬곱을 통해 해결할 수 있다.
#이 행렬곱 연산의 속도가 여러 딥러닝 프레임워크의 연산속도의 기반이 된다.
#3) 다차원 배열의 계산


#######KEYWORD########





######################

#다차원 배열이란 숫자를 한줄(1차원), 혹은 직사각형이나 정사각형(2차원), 정육면체나 직육면체(3차원), 혹은 그 이상의 N차원으로 나열하는 것을 통틀어
#다차원 배열이라고 한다. 파이썬의 Numpy 라이브러리를 이용하면 다차원 배열을 사용할 수 있다.
#아래 코드는 여태까지 사용했던 1차원 배열이다.


import numpy as np
#1차원 배열
A = np.array([1,2,3,4])
print(A)
np.ndim(A) #몇차원배열?
A.shape #배열의 모양을 튜플로 반환하는 메소드
A.shape[0]

#2차원 배열
A=np.array([[1,2],[3,4],[5,6]])
print(A)
np.ndim(A)
A.shape #3행 2열

#1차원 배열은 벡터라고 한다. 벡터는 방향과 크기의 의미를 모두 포함하는 타입으로 스칼라 값들을 순서대로 가진다.
#2차원 배열에서 볼 수 있듯이 2차원 배열은 행렬과 동일한 형태를 가진다.
#이는 2차원 배열간 연산에 행렬 연산을 할 수 있다는 것을 의미한다.
#행렬의 내적, 역행렬 등등 중요한 행렬 연산들을 numpy array를 통해 할 수 있다.

#파이썬으로 행렬 내적을 하는 방법은 다음과 같다.
A=np.array([[1,2],[3,4]])
B=np.array([[5,6],[7,8]])

#행렬내적을 해주는 numpy 메소드 dot() (행렬곱)
np.dot(A,B)

#행렬 내적을 하기 위해선 좌측 행렬의 열과 우측 행렬의 행이 같아야만 한다.
#예를 들면 (3,2) 행렬과 (2,3) 행렬은 좌측 행렬의 열이 2, 우측 행렬의 행이 2로 같으므로 행렬곱이 가능하고 결과로 (3,3) 행렬이 출력된다.
#또한 (2,3) 행렬과 (3,2) 행렬은 행렬곱을 하면 (2,2) 행렬이 출력된다. 좌측 행렬의 열과 우측 행렬의 행이 같지 않다면
#dot() 메소드를 사용했을 때 shape이 같지 않다는 에러가 출력된다.

#이 규칙은 차원이 다른 배열간의 내적을 구할때도 적용된다. 2차원 배열인 (3,2)행렬과 1차원 배열인 (2)는 내적이 가능하며
#결과로 1차원 배열이 출력된다. 1차원 배열은 위 파이썬 코드에서도 확인 했듯이 (2,) 형태이기 떄문.

import numpy as np
A = np.array([[1,2],[3,4],[5,6]])
B = np.array([7,8])
A.shape
B.shape
np.dot(A,B)
np.dot(A,B).shape

#2차원 배열인 행렬과 1차원 배열인 벡터간 행렬곱을 확인 할 수 있다.
#이러한 행렬곱이 중요한 이유는 신경망에서 입력값과 가중치의 곱의 합을 통한 활성함수 계산이 용이하기 때문.
#이를 간단한 수식으로 확인하면 P33. 그림23
#           1  3  5
# (x1  x2)(         ) = (y1 y2 y3)
#           2  4  6

#입력층과 출력층 그리고 가중치는 위의 행렬곱으로 표현할 수 있다.
#여기서 주의해야할 점은 각 곱의 차원의 원소수가 같아야 한다는 점.
#이를 파이썬으로 계산해보면 아래와 같다.
X=np.array([1,2])
W=np.array([[1,3,5],[2,4,6]])
Y=np.dot(X,W)
print(Y) # 5 11 17

#이처럼 다차원 배열을 이용하면 아무리 신경망 구조가 복잡하더라도 행렬곱을 통해 해결할 수 있다.
#이 행렬곱 연산의 속도가 여러 딥러닝 프레임워크의 연산속도의 기반이 된다.
#3) 다차원 배열의 계산 #######KEYWORD######## ###################### #다차원 배열이란 숫자를 한줄(1차원), 혹은 직사각형이나 정사각형(2차원), 정육면체나 직육면체(3차원), 혹은 그 이상의 N차원으로 나열하는 것을 통틀어 #다차원 배열이라고 한다. 파이썬의 Numpy 라이브러리를 이용하면 다차원 배열을 사용할 수 있다. #아래 코드는 여태까지 사용했던 1차원 배열이다. #1차원 배열 #몇차원배열? #배열의 모양을 튜플로 반환하는 메소드 #2차원 배열 #3행 2열 #1차원 배열은 벡터라고 한다. 벡터는 방향과 크기의 의미를 모두 포함하는 타입으로 스칼라 값들을 순서대로 가진다. #2차원 배열에서 볼 수 있듯이 2차원 배열은 행렬과 동일한 형태를 가진다. #이는 2차원 배열간 연산에 행렬 연산을 할 수 있다는 것을 의미한다. #행렬의 내적, 역행렬 등등 중요한 행렬 연산들을 numpy array를 통해 할 수 있다. #파이썬으로 행렬 내적을 하는 방법은 다음과 같다. #행렬내적을 해주는 numpy 메소드 dot() (행렬곱) #행렬 내적을 하기 위해선 좌측 행렬의 열과 우측 행렬의 행이 같아야만 한다. #예를 들면 (3,2) 행렬과 (2,3) 행렬은 좌측 행렬의 열이 2, 우측 행렬의 행이 2로 같으므로 행렬곱이 가능하고 결과로 (3,3) 행렬이 출력된다. #또한 (2,3) 행렬과 (3,2) 행렬은 행렬곱을 하면 (2,2) 행렬이 출력된다. 좌측 행렬의 열과 우측 행렬의 행이 같지 않다면 #dot() 메소드를 사용했을 때 shape이 같지 않다는 에러가 출력된다. #이 규칙은 차원이 다른 배열간의 내적을 구할때도 적용된다. 2차원 배열인 (3,2)행렬과 1차원 배열인 (2)는 내적이 가능하며 #결과로 1차원 배열이 출력된다. 1차원 배열은 위 파이썬 코드에서도 확인 했듯이 (2,) 형태이기 떄문. #2차원 배열인 행렬과 1차원 배열인 벡터간 행렬곱을 확인 할 수 있다. #이러한 행렬곱이 중요한 이유는 신경망에서 입력값과 가중치의 곱의 합을 통한 활성함수 계산이 용이하기 때문. #이를 간단한 수식으로 확인하면 P33. 그림23 #           1  3  5 # (x1  x2)(         ) = (y1 y2 y3) #           2  4  6 #입력층과 출력층 그리고 가중치는 위의 행렬곱으로 표현할 수 있다. #여기서 주의해야할 점은 각 곱의 차원의 원소수가 같아야 한다는 점. #이를 파이썬으로 계산해보면 아래와 같다. # 5 11 17 #이처럼 다차원 배열을 이용하면 아무리 신경망 구조가 복잡하더라도 행렬곱을 통해 해결할 수 있다. #이 행렬곱 연산의 속도가 여러 딥러닝 프레임워크의 연산속도의 기반이 된다.