글을 시작하며

이전에 작성한 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파일로 저장함.

글을 시작하며

부스트캠프에서 수업을 한 Numpy부분을 정리하고 공부하기 위해서 작성합니당

계속 하는데 잘 까먹는다...하면서 글을 시작!😂

 

Numpy란?

  • Numerical Python
  • 파이썬의 고성능 과학 계산용 패키지
  • Matrix와 Vector와 같은 Array 연산의 사실상의 표준
  • 한글로 넘파이로 주로 통칭
  • 일반 List에 비해 빠르고, 메모리 효율적
  • 반복문 없이 데이터 배열에 대한 처리를 지원함
  • 선형대수와 관련된 다양한 기능을 제공함
  • c, c++, 포트란 등의 언어와 통합가능

ndarray

import numpy as np

test_array = np.array([1, 4, 5, 8], float)
print(test_array)
type(test_array[3])

# [1. 4. 5. 8.]
# numpy.float64
  • numpy는 np.array 함수를 활용 배열을 생성함. → ndarray(객체)
  • numpy는 하나의 데이터 type만 배열에 넣을 수 있음.
  • List와 가장 큰 차이점 → dynamic typing not supported
  • C의 Array를 사용하여 배열을 생성함.
  • numpy array는 차례대로 값이 저장되는 반면 파이썬의 List는 값의 주소값을 List에 넣어서 2번 들어가는 방식이다.(-5 ~ 256은 고정 주소값)
  • 타입도 일정하기 때문에 메모리도 효율적이다.
test_array = np.array([1, 4, 5, "8"], float) # String Type의 데이터를 입력해도

print(test_array)
print(type(test_array[3])) # Float Type으로 자동 형변환을 실시
print(test_array.dtype) # Array(배열) 전체의 데이터 Type을 반환함
print(test_array.shape) # Array(배열) 의 shape을 반환함
print(test_array.nbytes) # ndarry object의 메모리 크기를 반환함.

# [1. 4. 5. 8.]
# <class 'numpy.float64'>
# float64
# (4,)
# 32  -> float64는 8bytes 이므로  4 * 8 = 32

 

numpy Rank

 

Hadling Shape

reshape : Array의 shape의 크기를 변경함, element의 갯수는 동일

  • reshape에서 (-1, n) 하면 n으로 지정하고 나머지 사이즈에 맞춰서 넣어진다.
  • ex : (2,4)를 reshape(-1,2) 하면 reshape(4,2)와 같다.

flatten : 다차원 array를 1차원 array로 변환.

ravel : 다차원 array를 1차원 array로 변환.

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

a1 = a.flatten()
a2 = a.ravel()
a3 = a.reshape(-1)

# array([1, 2, 3, 4, 5, 6, 7, 8])
# array([1, 2, 3, 4, 5, 6, 7, 8])
# array([1, 2, 3, 4, 5, 6, 7, 8])

a[0][0] = 100
a

# array([[100,   2,   3,   4],
#       [  5,   6,   7,   8]])

a1
# array([1, 2, 3, 4, 5, 6, 7, 8])
a2
# array([100,   2,   3,   4,   5,   6,   7,   8])
a3
# array([100,   2,   3,   4,   5,   6,   7,   8])

 

위에서 보이는 것처럼 reshape과 flatten, reval로 1차원으로 만들 수 있습니다. 각각의 함수에 차이점이 있다면 아래와 같습니다.

numpy.ravel() numpy.reshape() numpy.ndarray.flatten()
1차원배열(contiguous flattened array)반환 데이터 변경 없이 형상만 변경하여 반환 1차원배열 복사본을 반환
원본 값 변경시 같이 변함 원본 값 변경시 같이 변함 원본 값 변경시 변하지 않음.

Indexing & Slicing

index : List와 달리 이차원 배열에서 [0,0]표기법을 제공함.

  • matrix 일 경우 앞은 row, 뒤는 column을 의미함.

slicing : List와 달리 행과 열 부분을 나눠서 slicing이 가능함.

  • matrix의 부분 집합을 추출할 때 유용함.
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)

a[:,2:] # 전체 Row의 2열 이상
a[1,1:3] # 1 Row의 1열 ~ 2열
a[1:3] # 1 Row ~ 2Row의 전체

Create Function

arange : array의 범위를 지정하여, 값의 list를 생성하는 명령어

np.array(30) # List의 range와 같음.
np.arange(0,5,0.5)  # (시작, 끝, step
np.arrange(30).reshpae(5,6)

zeros : 0으로 가득찬 ndarray 생성 np.zeros(shape, dtype, order)

ones : 1로 가득찬 ndarray 생성

empty : shape만 주어지고 비어있는 ndarray 생성 (memory initialization이 되지 않음)

something_list : 기존 ndarray의 shape 크기 만큼 1, 0 또는 empty array를 반환

identity : 단위행렬(i행렬)을 생성함.

eye : 대각선이 1인 행렬, k값의 시작 index의 변경이 가능.

diag : 대각 행렬의 값을 추출함.

random sampling : 데이터 분포에 따른 sampling으로 array를 생성 (시작, 끝, 개수)

+ Recent posts