글을 시작하며
이전에 작성한 Numpy에 이어서 작성하는 글입니다. 이전 글을 보고 싶으신 분은 아래 링크를 눌러 확인해주세요😁
2021/02/07 - [인공지능 공부/이론 및 파이썬] - [이론 및 파이썬] Numpy(1)
Operation Function
sum : ndarray의 element들 간의 합을 구함
axis : 모든 operation function을 실행할 때 기준이 되는 dimension 축
mean & std : ndarray의 element들 간의 평균 또는 표준 편차를 반환
그 외에도 다양한 수학 연산자를 제공함.
concatenate : numpy array를 합치는(붙이는 함수)
np.newaxis 하면 축이 하나 추가가 됨.
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([5,6])
b = b[np.newaxis, :]
b
# array([[5, 6]])
np.concatenate((a,b.T), axis=1) # T는 transpose
# array([[1, 2, 5],
# [3, 4, 6]])
Array Operations
array간의 기본적인 사칙 연산을 지원함.
S
Element-wise operations
- Array간 shape이 같을 때 일어나는 연산.
Dot product
- Matrix의 기본 연산, dot 함수 사용.
- 2dimension에서 내적
broadcasing : Shape이 다른 배열 간 연산을 지원하는 기능
Scaler - vector 외에도 vector- matrix 간의 연산도 지원
Numpy와 for loop 속도차이
- 일반적으로 속도는 다음과 같다.
- for loop < list comprehension < numpy
- 100,000,000 번의 loop이 돌 때, 약 4배 이상의 성능 차이를 보임
- Numpy는 C로 구현되어 있어, 성능을 확보하는 대신 파이썬의 가장 큰 특징인 dynamic typing을 포기함
- 대용량 계산에서는 가장 흔히 사용됨
- Concatenate처럼 계산이 아닌, 할당에서는 연산 속도의 이점이 없음.
def sclar_vector_product(scalar, vector):
result = []
for value in vector:
result.append(scalar * value)
return result
iternation_max = 100000000
vector = list(range(iternation_max))
scalar = 2
%timeit sclar_vector_product(scalar, vector) # for loop을 이용한 성능
%timeit [scalar * value for value in range(iternation_max)]
# list comprehension을 이용한 성능
%timeit np.arange(iternation_max) * scalar # numpy를 이용한 성능
# 21.9 s ± 927 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 16.6 s ± 104 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 450 ms ± 46.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Comparision
All & any
import numpy as np
a = np.arange(10)
a < 4
#array([ True, True, True, True, False, False, False, False, False,False])
np.any(a>5), np.any(a<0)
# (True, False)
np.all(a>5), np.all(a < 10)
# (False, True)
numpy는 배열의 크기가 동일 할 때 element간 비교의 결과를 Boolean type으로 반환
test_a = np.array([1, 3, 0], float)
test_b = np.array([5, 2, 1], float)
test_a > test_b
# array([False, True, False])
np.where
a = np.arange(10)
np.where(a > 5, 3, 2) # where(condition, TRUE, FALSE)
# array([2, 2, 2, 2, 2, 2, 3, 3, 3, 3])
np.where(a > 5) # 인덱스 값이 나옴
# (array([6, 7, 8, 9], dtype=int64),)
a = np.array([1, np.NaN, np.Inf], float)
np.isnan(a) # 메모리의 값이 존재하지 않는 경우
# array([False, True, False])
np.isfinite(a) # 한정되지 않는 값.
# array([ True, False, False])
argmax & argmin
a = np.array([1, 2, 4, 5, 8, 78, 23, 3])
a.argsort()
# array(0,1,7,2,3,4,6,5])
a.argsort()[::-1]
# array([5, 6, 4, 3, 2, 7, 1, 0], dtype=int64)
np.argmax(a), np.argmin(a)
# (5, 0)
a = np.array([[1, 2, 4, 7], [9, 88, 6, 45], [9, 76, 3, 4]])
np.argmax(a, axis=1), np.argmin(a, axis=0)
# (array([3, 1, 1], dtype=int64), array([0, 0, 2, 2], dtype=int64))
boolean index
test_array = np.array([1, 4, 0, 2, 3, 8, 9, 7], float)
test_array > 3
# array([False, True, False, False, False, True, True, True])
test_array[test_array > 3]
# array([4., 8., 9., 7.])
fancy index
a = np.array([2, 4, 6, 8], float)
b = np.array([0,0,1,3,2,1],int)
a[b]
a.take(b) # take 함수: bracket index와 같은 효과
# array([2., 2., 4., 8., 6., 4.])
boolean index는 원래 index의 shape이 같아야하지만 fancy index는 같을 필요는 없음. 하지만 index범위 안에 있어야함.
numpy data i/o
- text type의 데이터를 읽고, 저장하는 기능
a = np.loadtxt("./poppulations.txt",delimiter="\t")
a_int = a.astype(int)
np.savetxt('int_data.csv', a)int, delimiter=",")
주로 npy파일로 저장함.
'인공지능 공부 > 이론 및 파이썬' 카테고리의 다른 글
[이론 및 파이썬] pandas, numpy 공부 (0) | 2021.02.07 |
---|---|
[이론 및 파이썬] Numpy(1) (0) | 2021.02.07 |
[이론 및 파이썬] 확률 및 통계 용어 정리(1) (0) | 2021.01.31 |
[이론 및 파이썬] L1 Norm과 L2 Norm (0) | 2021.01.30 |
[이론 및 파이썬] 정규 표현식 (0) | 2021.01.30 |