ㅅㅇ

numpy _ 04_1 벡터 연산 본문

AI_STUDY/Numpy

numpy _ 04_1 벡터 연산

SO__OS 2022. 6. 24. 00:26
플레이데이터 빅데이터캠프 공부 내용 _ 6/22

numpy _ 04_1 벡터 연산

1. 벡터화  -  벡터 연산

- 같은 형태(shape) 의 배열(벡터, 행렬)  간의 연산은  '같은 index'의 원소끼리 !! 연산을 한다. 
    - Element-wise(원소별) 연산 이라고도 한다.


    - 배열간의 연산시 배열의 형태가 같아야 한다.
        - 연산할 배열들은 shape가 같아야 한다. 그리고 그 결과도 shape가 같을 것이다.(내적 말하는 거 아님)
    - 배열의 형태가 다른 경우 Broadcast 조건을 만족하면 연산이 가능하다.

 

 

(1) 벡터/행렬과 스칼라간 연산

 

- 배열(1차원 배열 : Vector) 과 scalar (상수) 간의 연산

 

x = np.array([10,20,30])

print(x + 10)
print(x * 5)
print(x > 20)
print((x > 20) | (x<5))

[20 30 40]
[ 50 100 150]
[False False  True]
[False False  True]

 

 

(2) 벡터 간의 연산

 

 

- 1차원 배열 (벡터) 와  1차원 배열 (벡터) 간의 연산 - 같은 index의 원소끼리 연산

 

x = np.array([10,20,30])
y = np.array([5,30,7])
print(x - y)
print(x % y)
print(x > y)

[  5 -10  23]
[ 0 20  2]
[ True False  True]

 

 

(3) 행렬 간의 연산

 

 - 같은 index 의 원소끼리 연산

 

y1 = np.array([[1,2],[3,4]])
y2 = np.array([[10,20],[30,40]])
r = y1+ y2

print(r.shape)
r

(2, 2)
array([[11, 22],
       [33, 44]])

 

2.  내적 (Dot product)

 

(1) 내적 연산자 및 함수

- @ 연산자 

- numpy.dot(벡터/행렬, 벡터/행렬)  함수 사용

 

(2) 목적 및 활용 예제

- 점수에 가중치 줄 때
    - (국어점수, 영어점수, 수학점수) (국어가중치,영어가중치,수학가중치)
- 300원 200원 100원 을 3개 2개 4개 샀다. 총 금액은?
    - (300,200,100) (3,2,4)

 

 

2.1 벡터(1차원 배열) 간의 내적
  

  - 같은 index의 원소끼리 곱한뒤 결과를 모두 더한다. == > 가중합 구할 때 사용
  - 벡터간의 내적의 결과는 스칼라가 된다.


    - 𝑥⋅𝑦 또는𝑥𝑇𝑦로 표현 (T는 전치시켜라는 의미 : 앞을 행백터로 전치시켜 뒤에 열벡터와)


    - 조건
        - 두 벡터의 차원 (원소의개수, size) 가 같아야 한다.
        - 앞의 벡터는 행벡터 뒤의 벡터는 열벡터 이어야 한다. ( = > 1차원배열)
            - 이건 수학적 의미로 넘파이에서는 1차원 배열 간 연산이라는 것만 이해하자.
            - numpy 에서는 vector 끼리 연산시, 앞의 벡터는 행벡터로 뒤의 벡터는 열벡터로 인식해 처리한다.
            

 

 

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

r1 = np.dot(a,b) # doc 함수를 이용
r2 = a @ b # @ 연산자 이용
r3 = np.sum(a*b) # 이러한 연산과 동일하다.

print(r1,r2,r3) # 다 동일한 결과 32 32 32

 

 

2. 2 행렬(2차원배열) 간의 내적

 

- 행렬과 행렬을 내적하면 그 결과는 행렬이 된다.


앞 행렬의 행과 뒤 행렬의 열 간에 내적을 한다.

 

 - - - > 앞 행렬의 열수뒤 행렬의 행수가 같아야 한다.

 - - - > 내적의 결과의 형태(shape)는 앞행렬의 행수뒤 행렬의 열수의 형태를 가진다.


           - (3 x 2) 와 (2 x 5) = (3 x 5)
           - (1 x 5) 와 (5 x 1) = (1 x 1)    

 

 

ex1 )  (2, 3)   (3,  2)  내적   == > (2, 2)

A = np.arange(1,7).reshape(2,3)
B = np.arange(1,7).reshape(3,2)

r1 = A @ B
r2 = np.dot(A,B)
print(r1.shape, r2.shape)   # (2, 2) (2, 2)
r1

[[22 28]
 [49 64]]

 

 

ex2 ) 가중합 예제 - 벡터 간 내적

 

# 가격 : 사과3000, 배5000, 수박20000
# 구입개수 :  사과10, 배5, 수박2 
# 총 액수는?

 

d1 = np.array([3000,5000,20000])  # 리스트 튜플 다 안되고 당연히 넘파이 배열만 가능
d2 = np.array([10,5,2])

result = d1@d2
result  # 95000

 

 

ex3 ) 가중합 예제 - 행렬 간 내적

 

# 가격 : 사과3000, 배5000, 수박20000
# 구입개수 : 모레 : [사과10, 배5, 수박2]    어제 :  [3,2,10]     오늘 :  [15,7,13]
# 총 액수는?

 

 

- d1 을 행렬로 만들어주기

 

d1 = np.array([3000,5000,20000])
d2 = np.array([[10,5,2],
              [3,2,10],
             [15,7,13]])
             
d1.shape, d2.shape    ((3,), (3, 3))
# 2차원 행렬로 만들기
d1 =d1[..., np.newaxis]
d2.shape, d1.shape   # ((3, 3), (3, 1))

d1
array([[ 3000],
       [ 5000],
       [20000]])

# 벡터와 행렬 간의 내적은?

 

 

- 행렬 간의 내적 :  (3, 3)  과  (3, 1) 간의 내적 == >   결과  (3, 1)

# 순서 바뀌면 안됨.
r = d2 @ d1  # ((3, 3), (3, 1))
r.shape  # (3, 1)

 

 

'AI_STUDY > Numpy' 카테고리의 다른 글

numpy _ 04_3 브로드캐스팅  (0) 2022.06.24
numpy _ 04_2 범용함수(Ufunc, Universal function)  (0) 2022.06.24
numpy _ 02_2 정렬  (0) 2022.06.24
numpy _ 02_1 배열의 원소 조회  (0) 2022.06.24
numpy _ 01_2 배열 생성  (0) 2022.06.23