[Day2] Boostcamp AI-Tech

donggunseo·2021년 8월 3일
0

Boostcamp AI-Tech

목록 보기
2/34

2021년 8월 3일
1주차 Python Basic & AI Math
강의수강 : Python 6강 ~ Python 7-2강

1. 학습내용 정리

오늘 강의에서는 numpy와 pandas에 대한 내용이었는데, 사실 이전에 코딩하면서 자주 사용하고 잘 알던 내용이었다. 그래서 개념이나 잘 몰랐던 부분 위주로 간단히만 서술해보겠다.

(1) numpy

numpy는 주로 ndarray(n-dimensional array)를 다루는 여러가지 수학적, 통계적 함수들이 담겨있는 module이다. Python의 List와 numpy의 ndarray가 가장 크게 다른 점은 dynamic typing이 지원되지 않는다는 점이다. 즉, 하나의 데이터 type만 배열에 넣을 수 있다는 것이다. 따라서 뿌리는 C의 array와 같다고 할 수 있다. 그렇기 때문에 ndarray를 선언할 때 지정한 dtype이나 default인 float로 다른 dtype을 가진 element들이 자동으로 변환된다

test_matrix = [[1,2,3,4],[1,2,5,8]]
np.array(test_matrix).reshape(8,)
->array([1,2,3,4,1,2,5,8])
np.array(test_matrix).reshape(-1,2).shape
->(4,2)

reshape는 ndarray의 shape를 바꾸는 함수인데 -1이 들어가면 원래 배열의 size를 기반으로 알아서 숫자가 정해진다. 이는 reshape가 element 갯수는 동일하게 유지하기 때문이다.

np.arrange(start,end,step)
np.zeros(shape,dtype,order)
np.ones(shape,dtype,order)
np.empty(shape,dtype,order)
np.something_like(test_matrix)

잘 알던 내용이 었지만 np.empty가 새로웠는데, 주어진 shape로 비어있는 ndarray를 생성하는 함수이다. 다만, memory initialization이 이루어지지 않아 이전에 사용했던 메모리의 값이 들어있을 수도 있다.
np.something_like는 주어진 배열과 같은 shape의 배열을 만드는데 something에 zero, one이 들어갈 수 있다.

np.eye(N, M, k, dtype)
np.diag(matrix, k)

np.eye는 대각선이 1인 N * M 행렬이며 k값을 지정하면 대각선이 시작하는 column index를 지정할 수 있다. np.diag는 행렬의 대각성분을 추출하여 배열로 내보내는데, np.eye와 마찬가지로 k값에 따라 그 시작점을 설정 할 수 있다.

a=np.array([1,2,3])
b=np.array([2,3,4])
np.vstack((a,b))


a = np.array([[1], [2], [3]])
b = np.array([[2], [3], [4]])
np.hstack((a,b))

a=np.array([1,2,3])
b=np.array([2,3,4])
np.concatenate((a,b), axis=0)

a = np.array([[1,2], [3,4]])
b = np.array([[5,6]])
np.concatenate((a,b.T), axis=1)


a = np.arrange(10)
np.any(a>5), np.any(a<0)
->True, False
np.all(a>5), np.all(a<10)
->False, True
np.where(condition,TRUE,FALSE)

any와 all은 배열내에 조건을 만족하는 원소의 여부에 따라 참과 거짓값을 내놓는다. where은 조건을 만족하는 원소에는 TRUE에 지정된 값을, 만족하지 않는 원소에는 FALSE에 지정된 값을 원소로 넣은 배열을 출력한다.

test_array = np.array([1,4,0,2,3,8,9,7], float)
test_array[test_array >3]
->array([1., 0., 2.])

a = np.array([2,4,6,8], float)
b = np.array([0,0,1,3,2,1], int) #반드시 integer로 선언
a[b]
->array([2., 2., 4., 8., 6., 4.])
a.take(b)
->array([2., 2., 4., 8., 6., 4.])

윗 코드는 boolean index라고 불리는데 index에 condition을 넣어 그에 맞는 배열만 뽑아내는 것이다. 아래 코드는 fancy index라고 불리는데, 다른 integer 배열을 통해 타겟 배열에서 해당 원소만 뽑아내어 새로운 배열을 만드는 것이다. a[b,c] 의 방법을 통해 matrix 형태의 데이터도 참조가 가능하다.

(2) pandas

구조화된 데이터의 처리를 지원하며 데이터 처리, 통계분석등의 기능을 지원하는 스프레드 처리 Moduled이다.

-Series

column vector를 표현하는 object로 numpy.ndarray의 subclass이다. 다음과 같이 선언한다.

list_data = [1,2,3,4,5]
list_name = ["a","b","c","d","e"]
example_obj = Series(data = list_data, index=list_name, dtype=np.float32, name="example_data")

index에도 배열을 넣어 data와 매칭시킬 수 있는데 이때 index 배열을 기준으로 series를 생성하기 때문에 data가 부족하거나 index에 해당하는 data가 없으면 NaN 값으로 생성한다.

-Dataframe

각 column을 key로 갖고 그에 대한 data들의 배열을 value로 갖는 dictionary 타입으로 만들 수도 있고 아니면 read_csv같은 함수로도 만들 수 있다. 다음과 같은 코드를 사용한다.

df = pd.DataFrame(raw_data, columns= [ ~~~~~] )

DataFrame안에서 loc함수를 이용하면 해당 index의 이름을 가진 인스턴스를 뽑아낼 수 있고, iloc함수를 사용하면 해당 index number 위치를 가진 인스턴스를 뽑아낼 수 있다. del df["column name"]을 통해 특정 column을 삭제할 수도 있다. 또, df.drop(index number)로 해당 index number 위치에 있는 인스턴스를 삭제할 수 있다. axis=1로 지정하면 column을 지우는 것과 같은 역할도 수행할 수 있다.

-series, dataframe operation

series는 index, dataframe은 index와 column을 모두 고려하여 해당되지 않는 index나 (index,column)의 데이터에는 NaN값이 채워진다. fill_value 파라미터를 통해 NaN값을 다른 값으로 채울 수 있다.

-lambda, map, apply

s1 = Series(np.arange(10))
s1.map(lambda x: x**2)
df.column.replace(~~~)

map 함수나 replace함수를 이용하면 column 내의 data를 변환할 수 있다. 또 lambda 함수를 f로 따로 정의한뒤 df.apply(f)로 적용도 가능하다.

-pandas built-in functions

df.describe()는 데이터들에 대한 통계를 보여주는 함수이다. df.unique()는 특정 column에 대한 유일한 값의 list를 반환하고, df.sort_values(columns, ascending)은 ascending의 유무에 맞게 해당 column을 sort하고 그에 따라 순서를 바꾼다.

이 외의 내용은 자세하게 알기보단 그때 그때 맞춰서 참고하면 될 내용이라 판단해 더는 정리하지 않겠다.

2. 과제 진행

현재, Text preprocessing하는 과제 3번을 해결했다. 오늘 숫자야구 과제 4번, 모스부호 과제 5번이 공개되었다. 특별히 어렵다기 보단 여러 예외처리와 조건에 맞는 함수들을 구현하는 과제라 시간만 쓴다면 충분히 해결 가능하다고 본다. 밤부터 4번 과제를 해결할 계획이다.

3. 피어 세션

심재빈님이 numpy ndarray의 주소가 바뀌는 것 같다고 질문을 던졌고, 확인해본 결과 같은 배열의 특정 index를 매번 참조할 때 마다 주소가 바뀌는 것을 확인했다. numpy는 c언어를 베이스로 하는데 c언어는 배열의 주소가 고정되어있고 각 index 마다 메모리 크기가 정해져 주소도 일관된 간격으로 매겨져 있는 데 이해가 가지 않았다. 이 부분은 금요일 멘토링 시간에 멘토님께 여쭤볼 계획이다.

수요일에 "피어세션이 피어씁니다"라는 행사가 있어 피피티를 제출하라고 해서 피피티를 만들었다. 너무 화목해보이는 조다.

4. 마무리

판다스랑 넘파이는 중요하긴 한데 모두 숙지하기엔 양이 너무 많다. 약간 그때그때 참고하는 식이 더 좋은 것 같다. 학습정리하다보니까 양이 많아서 내용들을 충분히 넣기에 시간이 낭비되는 느낌이 들었다.

0개의 댓글