본문 바로가기
AI Naver boost camp/[Week 02] ML LifeCycle

Numpy - dot, @, * 차이점

by AI-BT 2024. 8. 16.
728x90
반응형

1. '@' 과 np.dot연산자

@ 연산자는 행렬 곱셈(Matrix Multiplication)을 수행하는 데 사용된다.

이는 numpy 배열 간의 행렬 곱셈을 간결하게 표현할 수 있는 연산자입니다.

차원, 2차원, 3차원 배열 등 모든 차원의 배열에서 요소별 곱셈을 수행할 수 있다.

import numpy as np

# 두 개의 2x2 행렬 생성
A = np.array([[1, 2],
              [3, 4]])

B = np.array([[5, 6],
              [7, 8]])

# 행렬 곱셈
C = A @ B

print("A @ B:")
print(C)

# 행렬 곱셈
D = np.dot(A, B)
print("np.dot(A, B):")
print(D)

# 결과
# A @ B:
# [[19 22]
#  [43 50]]

# np.dot(A, B):
# [[19 22]
#  [43 50]]

# [[1*5 + 2*7, 1*6 + 2*8]
#  [3*5 + 4*7, 3*6+ 4*8]]

 

@와 np.dot는 동일한 기능을 제공하며, 두 배열 간의 행렬 곱셈을 수행한다.


2. (*)별연산

별 연산자 *는 Numpy에서요소별 곱셈으로 사용된다.

이는 두 배열의 같은 위치에 있는 요소들끼리 곱하는 연산이다.

 

import numpy as np

# 두 개의 2x2 배열 생성
A = np.array([[1, 2],
              [3, 4]])

B = np.array([[5, 6],
              [7, 8]])

# 요소별 곱셈
C = A * B

print("A * B (요소별 곱셈):")
print(C)

# A * B (요소별 곱셈):
# [[ 5 12]
#  [21 32]]

 


3. '@' 과 'np.dot' 의 3차원 배열에서 차이점

1. np.dot

  • 1차원 배열: 벡터의 내적을 계산합니다.
  • 2차원 배열: 행렬 곱셈을 수행합니다. (@ 동일)
  • 3차원 배열: 마지막 두 축에 대해 행렬 곱셈을 수행합니다.
import numpy as np

# 두 개의 3차원 배열 생성
A = np.array([[[1, 2],
               [3, 4]],

              [[5, 6],
               [7, 8]]])

B = np.array([[[1, 2],
               [3, 4]],

              [[5, 6],
               [7, 8]]])

# np.dot 사용
C_dot = np.dot(A, B)

print("np.dot(A, B).shape:", C_dot.shape)
print("np.dot(A, B):")
print(C_dot)

 

결과

np.dot(A, B).shape: (2, 2, 2, 2)
np.dot(A, B):
[[[[ 7 10]
   [15 22]]

  [[15 22]
   [31 46]]]


 [[[31 46]
   [55 80]]

  [[55 80]
   [91 130]]]]

 

2. @

  • 1차원 배열: 벡터의 내적을 계산합니다.
  • 2차원 배열: 행렬 곱셈을 수행합니다. (np.dot 동일)
  • 3차원 배열: 두 배열 간의 행렬 곱셈을 수행할 때, @ 연산자는 np.matmul와 유사하게 동작합니다. np.matmul은 두 배열의 마지막 두 축에 대해 행렬 곱셈을 수행하며, 배치 차원(앞의 축들)을 유지합니다.
import numpy as np

# 두 개의 3차원 배열 생성
A = np.array([[[1, 2],
               [3, 4]],

              [[5, 6],
               [7, 8]]])

B = np.array([[[1, 2],
               [3, 4]],

              [[5, 6],
               [7, 8]]])

# @ 사용
C_at = A @ B

print("A @ B.shape:", C_at.shape)
print("A @ B:")
print(C_at)

 

결과

A @ B.shape: (2, 2, 2)
A @ B:
[[[  7  10]
  [ 15  22]]

 [[ 31  46]
  [ 55  80]]]

 

딥러닝에서의 활용

    1. 배치 처리:
      • 딥러닝에서는 데이터를 배치 단위로 처리하는 경우가 많습니다. 예를 들어, 신경망의 가중치와 입력 데이터를 배치 차원에서 곱해야 할 때 @ 연산자를 사용할 수 있습니다. @ 연산자는 배치 차원을 유지하며 마지막 두 축 간의 행렬 곱셈을 수행하므로, 딥러닝의 행렬 연산과 잘 맞아떨어집니다.
    2. 다차원 연산:
      • 딥러닝에서는 3차원 이상의 배열을 사용하여 여러 배치와 채널을 동시에 처리할 수 있습니다. @ 연산자는 이러한 다차원 배열 간의 행렬 곱셈을 간결하게 처리할 수 있습니다. 예를 들어, CNN(Convolutional Neural Networks)에서 필터와 활성화 맵의 곱셈을 수행할 때 유용합니다.
    3. 호환성:
      • np.dot은 더 오래된 numpy 버전에서도 사용할 수 있지만, 최신 버전의 numpy에서는 @ 연산자를 사용하는 것이 더 권장됩니다. @는 가독성이 좋고 직관적인 연산자로, 코드의 명확성을 높여줍니다.
    4. 최적화:
      • 특히 GPU와 같은 하드웨어 가속을 사용할 때, @ 연산자는 최적화된 연산을 제공하여 효율성을 높이는 데 도움이 됩니다. np.matmul과 @는 GPU 가속을 지원하는 연산으로, 대규모 데이터 처리 시 성능이 향상됩니다.
    5. np.dot의 장점 :
      • np.dot은 마지막 두 축에 대한 연산 외에도 여러 배열의 차원 간의 내적 연산을 지원합니다.
      • 호환성: 오래된 numpy 코드에서 여전히 사용되고 있으며, np.dot은 특정 연산에 대해 세부적인 제어가 필요한 경우 유용할 수 있다.
728x90
반응형

댓글