넘파이에서 지원하는 element-wise product (Hadamrad product), dot product, matrix multiplication 등등을 알아본다.
구체적인 명령어들은 다음과 같다.
- *
- np.multiply
- np.dot
- @
- np.inner
- np.outer
- np.matmul
- np.vdot
Element-wise Product = Hadamard Product
연산자들
- *
- np.multiply
1D Array 1차원 배열
import numpy as np
a = np.array([1, 2])
b = np.array([3, 4])
c = a * b
print(c)
>> [3 8]
c = np.multiply(a, b)
print(c)
>> [3 8]
2D Array 2차원 배열
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
c = a * b
print(c)
>> [[ 5 12]
[21 32]]
c = np.multiply(a, b)
print(c)
>> [[ 5 12]
[21 32]]
# 상수 곱
a*2
array([[2, 4],
[6, 8]])
서로 차원이 달라도 알아서 브로드캐스팅해서 결과를 도출한다.
x1 = np.arange(9.0).reshape((3, 3))
x2 = np.arange(3.0)
print(x1)
print(x2)
x1 * x2
>>
[[0. 1. 2.]
[3. 4. 5.]
[6. 7. 8.]]
[0. 1. 2.]
array([[ 0., 1., 4.],
[ 0., 4., 10.],
[ 0., 7., 16.]])
np.multiply(x1, x2)
>>
array([[ 0., 1., 4.],
[ 0., 4., 10.],
[ 0., 7., 16.]])
Dot Product
PyTorch와는 다르게 2D 이상의 배열에 대해서도 지원한다.
연산자들
- np.dot
- @
1D Array 1차원 배열
a = np.array([1, 2])
b = np.array([3, 4])
c = np.dot(a, b)
print(c)
>> 11
2D Array 2차원 배열
np.dot과 @은 같은 연산이다.
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
c = np.dot(a, b)
print(c)
>> [[19 22]
[43 50]]
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
c = a @ b
print(c)
>> [[19 22]
[43 50]]
Inner product와 계산 방법이 다르다.
수학 시간에 배운 matrix multiplication과 같다.
c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0]
c[0][1] = a[0][0] * b[1][0] + a[0][1] * b[1][1]
c[1][0] = a[0][0] * b[1][0] + a[0][1] * b[1][1]
c[1][1] = a[1][0] * b[1][0] + a[1][1] * b[1][1]
19 = 1 * 5 + 2 * 7
22 = 1 * 6 + 2 * 8 = 22
43 = 3*5 + 4*7 = 43
50 = 3 * 7 + 4 * 8 = 50
Inner Product 내적
연산자들
- np.inner
1D Array 1차원 배열
np.dot과 같은 결과다.
a = np.array([1, 2])
b = np.array([3, 4])
c = np.inner(a, b)
print(c)
>> 11
2D Array 2차원 배열
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
c = np.inner(a, b)
print(c)
>> [[17 23]
[39 53]]
이전에 블로그에서 작성한 PyTorch의 Inner product 계산과 동일하다. (참고 링크)
c[0][0] = a[0] * b[0]
c[0][1] = a[0] * b[1]
c[1][0] = a[1] * b[0]
c[1][1] = a[1] * b[1]
17 = 1*5 + 2*6
23 = 1*7 + 2*8
39 = 3*5 + 4*6
53 = 3*7 + 4*8
Outer Product 외적
연산자들
- np.outer
1D Array 1차원 배열
a = np.array([1, 2])
b = np.array([3, 4])
c = np.outer(a, b)
print(c)
>> [[3 4]
[6 8]]
Matrix Multiplication, Matrix Product, 행렬 곱
torch.matmul, torch.mm, @을 비교한다.
연산자들
- np.matmul
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
print(np.matmul(a, b))
>> [[19 22]
[43 50]]
np.matmul(b, a)
>> array([[23, 34],
[31, 46]])
3차원 이상의 배열
a = np.ones([9, 5, 7, 4])
c = np.ones([9, 5, 4, 3])
print(np.dot(a, c).shape)
np.matmul(a, c).shape
# n is 7, k is 4, m is 3
>> (9, 5, 7, 9, 5, 3)
(9, 5, 7, 3)
vdot
Complex number 복소수에 대한 dot product 연산이다.
2D 배열의 경우 Frobenius inner product를 반환한다.
연산자들
- np.vdot
import numpy as np
a = np.array([1+2j, 3+4j])
b = np.array([5+6j, 7+8j])
print(np.vdot(a, b))
np.vdot(b, a)
>> (70-8j)
(70+8j)
References:
https://numpy.org/doc/2.2/reference/generated/numpy.matmul.html
https://numpy.org/doc/stable/reference/generated/numpy.multiply.html
'AI Codes > Numpy' 카테고리의 다른 글
Numpy Random Number Generating (1) | 2025.04.20 |
---|---|
Numpy zeros, zeros_like, ones 등등 (0) | 2025.04.20 |