ML/NumPy

N차원 배열의 연산

spring_sunshine 2022. 10. 9. 12:30

배열 연산

배열끼리 연산을 진행할 시 배열간의 shape이 동일해야 한다.

arr1 = np.array([[1,2,3], [4,5,6], [7,8,9]])
arr2 = np.array([[2,2,2], [2,2,2], [2,2,2]])

# 덧셈
print(arr1+arr2)
print(np.add(arr1,arr2))

# 뺄셈
print(arr1-arr2)
print(np.subtract(arr1,arr2))

# 곱셈
print(arr1*arr2)
print(np.multiply(arr1,arr2))

# 나눗셈
print(arr1/arr2)
print(np.divide(arr1,arr2))

# 제곱
print(arr1**2)
print(np.square(arr1))

# 제곱근
print(np.sqrt(arr1))

# 몫
print(arr1//2)

# 나머지
print(arr1%2)

행렬 연산

# 1차원 행렬
arr1 = np.array([2,3,4])
arr2 = np.array([1,2,3])
print(np.dot(arr1,arr2))

# 2차원 행렬 
arr1 = np.array([[1,2],[4,5]])
arr2 = np.array([[1,2],[0,3]])
print(np.dot(arr1,arr2))
#[1,2] [1,2]  [1 8]
#[4,5] [0,3]  [4 23]

기타 연산 

# 절댓값
arr1 = np.array([[1,-2],[-4,5]])
print(np.abs(arr1))

# 올림 
print(np.ceil(arr1))

# 내림
print(np.floor(arr1))

# 반올림
print(np.round(arr1))

# 버림
print(np.trunc(arr1))

연산 함수

arr = np.array([[1,2,3], [0,1,4]])

# min
print(np.min(arr))
print(arr.min())
print(arr.min(axis=0))
print(arr.min(axis=1))
# 0
# 0
# [0 1 3]
# [1 0]

# max
print(np.max(arr))
print(arr.max())
print(arr.max(axis=0))
print(arr.max(axis=1))
# 4
# 4
# [1 2 4]
# [3 4]

# sum
print(np.sum(arr))
print(arr.sum())
print(arr.sum(axis=0))
print(arr.sum(axis=1))
# 11
# 11
# [1 3 7]
# [6 5]

# mean
print(np.mean(arr))
print(arr.mean())
print(arr.mean(axis=0))
print(arr.mean(axis=1))
# 1.8333333333333333
# 1.8333333333333333
# [0.5 1.5 3.5]
# [2.         1.66666667]

# std() 표준편차값
print(np.std(arr))
print(arr.std())
print(arr.std(axis=0))
print(arr.std(axis=1))
# 1.343709624716425
# 1.343709624716425
# [0.5 0.5 0.5]
# [0.81649658 1.69967317]

# cumsum() 누적합
print(np.cumsum(arr))
print(arr.cumsum())
print(arr.cumsum(axis=0))
print(arr.cumsum(axis=1))
# [ 1  3  6  6  7 11]
# [ 1  3  6  6  7 11]
# [[1 2 3]
#  [1 3 7]]
# [[1 3 6]
#  [0 1 5]]

# median 중앙값
print(np.median(arr))
print(np.median(arr, axis=0))
print(np.median(arr, axis=1))
# 1.5
# [0.5 1.5 3.5]
# [2. 1.]

 

# 비교연산
arr1 = np.array([[1,2,3],
                 [4,5,6]])
arr2 = np.array([[1,0,3],
                 [4,-2,9]])
print(arr1==arr2)
print(arr1>=arr2)
print(np.array_equal(arr1,arr2)) # 배열전체 동일여부
# [[ True False  True]
#  [ True False False]]
# [[ True  True  True]
#  [ True  True False]]
# False

# 삼각함수
arr = np.array([[1,2,3],
                 [4,5,6]])
# sin()
print(np.sin(arr))
# cos()
print(np.cos(arr))
# tan()
print(np.tan(arr))
# pi
print(np.pi)
# [[ 0.84147098  0.90929743  0.14112001]
#  [-0.7568025  -0.95892427 -0.2794155 ]]
# [[ 0.54030231 -0.41614684 -0.9899925 ]
#  [-0.65364362  0.28366219  0.96017029]]
# [[ 1.55740772 -2.18503986 -0.14254654]
#  [ 1.15782128 -3.38051501 -0.29100619]]
# 3.141592653589793

브로드캐스팅(Broadcasting)

3*3행렬과 1*3행렬

 

1*3행렬과 3*1행렬

# 3*3 행렬
arr1 = np.array([[0,0,0],
                 [1,1,1],
                 [2,2,2]])
# 1*3 행렬
arr2 = np.array([[5,6,7]])
print(arr1+arr2)
# [[5 6 7]
#  [6 7 8]
#  [7 8 9]]

벡터(행렬) 연산의 장점

  • 배열의 연산을 매우 빠르게 처리한다.
  • 특히 딥러닝에서 선형대수 관련 연산에서 높은 연산속도를 보인다.
import time
# for문
sum = 0
before = time.time()
for i in arr:
  sum += i
after = time.time()
print(sum, after-before, '초')
# [5 7 9] 0.00011706352233886719 초

# 벡터연산
before = time.time()
sum = np.sum(arr)
after = time.time()
print(sum, after-before, '초')
# 21 0.00017762184143066406 초