[TIL] Python numpy, tensorflow, pytorch array

Hanna·2021년 9월 10일
0

Python

목록 보기
3/4

array : data type = homogeneous / sequence data type. 같은 종류의 순서가 있는 데이터. 프로그래밍 용어 => indexing, slicing, sequence operatoration 가능함

sequence operatoration?

x = [1, 2, 3]
x + x
>> [1, 2, 3, 1, 2, 3]

'abc' + 'bcd'
>> 'abcbcd'

3*'abc'
>> 'abcabcabc'

Tensorflow에서 Operator overloading ?
원래 array + array = 뒤에서 붙어주는 연산인데 tensorflow에서는 vectorization으로 지원해줌

vectorization연산? elementwise방식으로 loop 없이 동시에 여러번 연산을 하는 연산

tensorflow, pytorch, mxnet는 numpy 기반으로 array를 만들었음. 다만 numpy는 CPU, tensorflow는 GPU로 연산을 함.

matrix : 수학, 물리적 용어

1차 : vector
2차 : matrix
3차 이상 : tensor

python array 와 numpy array의 차이

import numpy as np
a = np.array([1, 2., '3'])
>> array(['1', '2.0', '3'], dtype='<U32')

array data 구조이기 때문에 자동으로 문자 구조로 바꿔줌.

import tensorflow as tf
b = tf.constant([1, 2., '3'])
>> ValueError 

numpy에서는 자동적으로 가장 큰 데이터 타입으로 바꿔주만 tensorflow에서는 sequence로 바꿔줄 수가 없어서 ValueError가 발생.
cf. pytorch에서도 마찬가지로 에러가 발생함

homogeneous의 장점 : 더 빠른 연산이 가능함. data type이 무엇인지 계산할 필요가 없음

coercion : python에서는 int 연산과 float 연산을 묵시적으로 해줌. 같은 데이터 타입으로 볼 때가 있지만 array에서는 아주 엄격하게 관리를 함.

선형대수를 프로그래밍 관점에서 구현해 놓은 게 array.

cf. ndarray랑 array랑 차이점
ndarray : numpy의 class 이름
class를 바로 만들기 어려우니까, foctory method를 제공함으로써 np.array를 통해서 쉽게 데이터를 만들어줌

ndarray : n-dimentional array 라고 하는 경우도 있음
glossary 관점에서 통칭으로 2차원 이상의 array라고 하는 경우도 많음

indexing

indexing : 여러개 데이터 중 하나만 가지고 오는 것
slicing : 여러개의 데이터를 가지고 오는 것, 대신 slicing 에러는 없음

a = np.arange(6).reshape(2, 3)
>> array([[0, 1, 2],[3, 4, 5]]) 
b = np.arange(24).reshape(2, 3, 4)
>> array([[[0, 1, 2, 3],
           [4, 5, 6, 8],
           [8, 9, 10, 11]],
          [[12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23]]])

numpy 기반에 indexing 기법
1. , indexing : b[:, : , 0]
2. boolean indexing : True만 뽑는 것. filter 기법. a[a > 3]
3. fancy indexing : 재조합하여 만들 수 있음 a[[1, 0]], a[[0, 1], [1, 2]]
4. ellipsis : 1개 이상의 콜론(:)을 대체.
a[0, ...] == a[0] == a[0, :], a[:,:] == a[...]
id(a) =! id(a[:, :]) =! id(a[...])

ellipsis가 필요한 이유
array는 homegeneous한 sequence type
numpy : mutable, CPU
tensorflow : immutable, GPU
mutable일 이기 때문에 memory를 공유함.

mutable일 때 문제점 : deep copy가 안 됨

a = [1, 2, 3]
b = a
b[0] = 100
a[0]
>> 100

c = [1, 2, 3]
d = c[:]
d[0] = 100
c[0]
>> 1

e = [[1, 2, 3], [4, 5, 6]]
f = e[:]
f[0][0] = 100
e[0][0]
>> 100

import copy
e = [[1, 2, 3], [4, 5, 6]]
f = copy.deepcopy(e)
f[0][0] = 100
e[0][0]
>> 1

numpy의 copy는 deepcopy가 됨

import numpy as np
e = np.array([[1, 2, 3], [4, 5, 6]])
f = e.copy()
f[0][0] = 100
e[0][0]
>> 1

e = np.array([[1, 2, 3], [4, 5, 6]])
f = e[...]
f[0][0] = 100
e[0][0]
>> 100

e = np.array([1, 2, 3])
f = e[:]
f[0] = 100
e[0]
>> 100
profile
매일 성장하고 있습니다

0개의 댓글