티스토리 뷰
집계함수
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]
'멀티캠퍼스 AI과정 > 03 Numpy' 카테고리의 다른 글
Numpy 10 - ndarray의 원소 추가와 삭제 (0) | 2020.09.09 |
---|---|
Numpy 09 - ndarray의 정렬 (0) | 2020.09.09 |
Numpy 07 - ndarray의 전치행렬과 Iterator (0) | 2020.09.09 |
Numpy 06 - ndarray의 사칙연산, 행렬곱, Broadcasting (0) | 2020.09.08 |
Numpy 05 - ndarray의 Indexing & Slicing (0) | 2020.09.08 |
댓글