글을 시작하며

이전에 작성한 Numpy에 이어서 작성하는 글입니다. 이전 글을 보고 싶으신 분은 아래 링크를 눌러 확인해주세요😁

2021/02/07 - [인공지능 공부/이론 및 파이썬] - [이론 및 파이썬] Numpy(1)

 

[이론 및 파이썬] Numpy(1)

글을 시작하며 부스트캠프에서 수업을 한 Numpy부분을 정리하고 공부하기 위해서 작성합니당 계속 하는데 잘 까먹는다...하면서 글을 시작!😂 Numpy란? Numerical Python 파이썬의 고성능 과학 계산용

hwanii-with.tistory.com

 

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파일로 저장함.

+ Recent posts