기록하는 습관

[Numpy] 008. 배열 간 연산과 브로드캐스팅 (Broadcasting) 본문

Python/Numpy

[Numpy] 008. 배열 간 연산과 브로드캐스팅 (Broadcasting)

Avalla 2023. 8. 9. 00:35

배열 간 연산

import numpy as np

 

Element-wise Operations

a1 = np.array([0,4,5])
a2 = np.array([3,1,2])
print( "a1 + a2 =", a1 + a2)
print( "a1 - a2 =", a1 - a2)
print( "a1 * a2 =", a1 * a2) # dot product가 아님
print( "a1 / a2 =", a1 / a2)
print( "a1 // a2 =", a1 // a2)
print( "a1 % a2 =", a1 % a2)
print( "a1 ** a2 =", a1 ** a2)
a1 + a2 = [3 5 7]
a1 - a2 = [-3  3  3]
a1 * a2 = [ 0  4 10]
a1 / a2 = [0.  4.  2.5]
a1 // a2 = [0 4 2]
a1 % a2 = [0 0 1]
a1 ** a2 = [ 0  4 25]

 

Dot Product : np.dot(a1,a2), a1.dot(a2)

transpose 하지 않아도 작동함

a1 = np.array([0,4,5])
a2 = np.array([3,1,2])
print( a1.dot(a2) )
print( np.dot(a1, a2) )
14
14
a1 = np.array([0,2,3])
a1.dot(a1)
13

 

Broadcasting

scalar ~ vector 뿐만 아니라 vector ~ matrix 연산도 지원

a1 = np.array([0,4,5])
a2 = np.array(3)
print( "a1 + a2 =", a1 + a2)
print( "a1 - a2 =", a1 - a2)
print( "a1 * a2 =", a1 * a2) # dot product가 아님
print( "a1 / a2 =", a1 / a2)
print( "a1 // a2 =", a1 // a2)
print( "a1 % a2 =", a1 % a2)
print( "a1 ** a2 =", a1 ** a2)
a1 + a2 = [3 7 8]
a1 - a2 = [-3  1  2]
a1 * a2 = [ 0 12 15]
a1 / a2 = [0.         1.33333333 1.66666667]
a1 // a2 = [0 1 1]
a1 % a2 = [0 1 2]
a1 ** a2 = [  0  64 125]
a1 = np.array([[0,2],[3,4]])
a2 = np.array([[2,5]])
print( a1, "\n", a2 )
print( "a1.shape :", a1.shape )
print( "a2.shape :", a2.shape )
print( "a1 + a2 =\n", a1 + a2)
[[0 2]
 [3 4]] 
 [[2 5]]
a1.shape : (2, 2)
a2.shape : (1, 2)
a1 + a2 =
 [[2 7]
 [5 9]]
a1 = np.array([[0,2],[3,4]])
a2 = np.array([[2],[5]])
print( a1, "\n", a2 )
print( "a1.shape :", a1.shape )
print( "a2.shape :", a2.shape )
print( "a1 + a2 =\n", a1 + a2)
[[0 2]
 [3 4]] 
 [[2]
 [5]]
a1.shape : (2, 2)
a2.shape : (2, 1)
a1 + a2 =
 [[2 4]
 [8 9]]

아래와 같이 양쪽 모두 브로드캐스팅이 일어남

a1 = np.array([1,2])
a2 = np.array([[4],[5]])
print( a1, "\n", a2 )
print( "a1.shape :", a1.shape )
print( "a2.shape :", a2.shape )
print( "a1 + a2 =\n", a1 + a2)
print( "a1 ** a2 =\n", a1 ** a2)
[1 2] 
 [[4]
 [5]]
a1.shape : (2,)
a2.shape : (2, 1)
a1 + a2 =
 [[5 6]
 [6 7]]
a1 ** a2 =
 [[ 1 16]
 [ 1 32]]