티스토리 뷰

집계함수

import numpy as np

arr = np.arange(1, 7, 1).reshape(2, 3).copy()
print(arr)
# [[1 2 3]
# [4 5 6]]

print(arr.sum())      # 21

print(np.sum(arr))    # 21

print(np.cumsum(arr)) # 누적합 => [ 1  3  6 10 15 21]
print(np.mean(arr))   # 3.5
print(np.max(arr))    # 6
print(np.min(arr))    # 1

print(np.argmax(arr)) # 최대값의 인덱스/ 순번 => 5
print(np.argmin(arr)) # 최소값의 인덱스/ 순번 => 0
print(np.std(arr))    # 표준편차 1.707

print(np.exp(arr))    # 자연상수 2.718... (자연로그의 승)
# [[  2.71828183   7.3890561   20.08553692]
#  [ 54.59815003 148.4131591  403.42879349]]

print(np.log10(arr))  # 상용로그값
# [[0.         0.30103    0.47712125]
#  [0.60205999 0.69897    0.77815125]]

이런 집계함수와 수학함수가 제공된다.

  • Numpy의 모든 집계함수는 axis를 기준으로 집계된다.
  • np.sum()
  • 만약, axis를 지정하지 않으면 axis는 None으로 설정되고, 함수의 대상 범위를 전체 ndarray로 지정하게 된다.
  • 1차원은 축이 1개, 2차원은 축이 2개, 3차원은 축이 3개
    • 이 축 (axis)는 숫자로 표현한다.
  • 1차원인 경우 axis = 0 열방향/ 세로방향

axis를 어떻게 설정하고 어떤 효과가 나타나는지?

1차원은 축이 1개, 2차원은 축이 2개, 3차원은 축이 3개

1. 1차원

  • axis를 지정하지 않으면, 전체 ndarray를 대상으로 sum() 수행
arr = np.array([1, 2, 3, 4, 5])        
print(arr)                            # [1 2 3 4 5]
# axis를 지정하지 않아 전체 ndarray를 대상으로 sum() 수행
print(arr.sum())                     # 15 
print(arr.sum(axis=0))                 # 15

2. 2차원

  • 2차원 axis=0 => 행 방향/ 행이 진행되는 방향/ 세로 방향 
  • 2차원 axis=1 => 열 방향/ 열이 진행되는 방행/ 가로 방향

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)                          # [[1 2 3]                            
                                    # [4 5 6]]
print(arr.sum())                    # 21
print(arr.sum(axis=0))              # [5 7 9]
print(arr.sum(axis=1))              # [ 6 15]

print(arr.argmax(axis=0))             # [1 1 1]
print(arr.argmax(axis=1))             # [2 2]

3. 3차원

  • 3차원에서 axis=0 => depth 방향
  • 3차원에서 axis=1 => 행 방향/ 세로 방향
  • 3차원에서 axis=0 => 열 방향 / 가로 방향
np.random.seed(1)
arr1 = np.random.randint(0, 10, (2, 2, 3))
print(arr1)
# [[[5 8 9]
#   [5 0 0]]

#  [[1 7 6]
#   [9 2 4]]]

print(arr1.sum())        # 56

print(arr1.sum(axis=0))  # 3차원에서 axis=0 => depth 방향
# [[ 6 15 15]
#  [14  2  4]]

print(arr1.sum(axis=1))  # 3차원에서 axis=1 => 행 방향/ 세로 방향
# [[10  8  9]
#  [10  9 10]]

print(arr1.sum(axis=2))  # 3차원에서 axis=0 => 열 방향 / 가로 방향
# [[22  5]
#  [14 15]]

Numpy 집계함수를 사용해야 하는 이유

  • 집계함수를 사용하는 시간과 로직으로 연산을 수행하는 시간을 비교

  • %%time : Jupyter Notebook에서만 사용할 수 있음, 실행 시간 재줌

import numpy as np

arr = np.arange(100000, dtype=np.float64) 
print(arr)
%%time

# for문을 이용해서 합을 구하거나
arr = np.arange(100000, dtype=np.float64) 
result = 0
for tim in arr:
    result += tmp

print(result)
# 500000
# Wall time: 36.9 ms
%%time

# 집계함수를 이용해서 구할 수 있다.
arr = np.arange(100000, dtype=np.float64) 
print(arr.sum())
# 4999950000.0
# Wall time: 958 µs

연습문제

ndarray안에 10보다 큰 수가 몇개 있는지 알아보자

import numpy as np

arr = np.arange(1, 17).reshape(4, 4).copy()
print(arr)
# [[ 1  2  3  4]
# [ 5  6  7  8]
# [ 9 10 11 12]
# [13 14 15 16]]

# boolean mask 이용
arr = np.arange(1, 17).reshape(4, 4).copy()
print((arr > 10).sum())  # 6

print(arr>10) # True만 1이니 sum()을 하면 갯수가 나온다.
# [[False False False False]
#  [False False False False]
#  [False False  True  True]
#  [ True  True  True  True]]

print(arr[arr>10])
# [11 12 13 14 15 16]
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함