ㅅㅇ
numpy _ 04_1 벡터 연산 본문
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 |