반응형

오늘은 Day7이다. 
파이썬의 외부 라이브러리에 관련된 내용인 것 같다.

Today's Assignment - day 7

이 튜토리얼에서는 파이썬의 라이브러리에 대한 몇가지 팁을 얻을 수 있을 것 같다.

Imports

지금까지 우리는 언어에 내장된 type과 function에 대해 알아보았었다.

하지만, 파이썬의 가장 좋은 점 중 하나는 파이썬을 위해 작성된 수많은 고품질 사용자 지정 라이브러리가 존재한다는 것이다.

이러한 라이브러리 중 일부는 "표준 라이브러리"에 있으며, 이는 파이썬을 실행하는 모든 곳에서 찾을 수 있음을 의미한다. 다른 라이브러리는 python과 함께 제공되지 않더라도 쉽게 추가할 수 있다.

뭐가됐든, 우리는 'import'로 접근할 수 있다.
먼저 표준 라이브러리에서 'math'를 가져와보자.

import math

print("It's math! It has type {}".format(type(math)))

math는 모듈이다. 모듈은다른 사용자가 정의한 변수의 집합이다.
파이썬에 내장된 함수 dir()을 사용해서 math이 어떤 변수와 메소드를 가지고 있는지 확인해 보자.

print(dir(math))

도트 구문을 사용해서 이러한 변수에 액세스 할 수 있다. 

print("pi to 4 significant digits = {:.4}".format(math.pi))

math.log(32, 2)

만약, math.log의 기능을 모를 경우 help()를 호출 할 수 있다.

help(math.log)

모듈 자체에 대해 help()를 사용할 수도 있다.
그러면 모듈의 모든 기능 및 값에 대한 통합 문서와 모듈에 대한 개략적인 설명이 제공된다. 

help(math)

양이 많으니, 추가로 확인하고싶으면 직접 help(math)를 실행 해보길 바란다!


Other import syntax

math를 import할 때 as 를 이용해서 더 짧은 별칭으로 가져올 수 있다.

import math as mt
mt.pi

pandas, numpy, TensorFlow 또는 Matplotlib와 같이 인기 있는 라이브러리에서 이 작업을 수행하는 코드를 본 적이 있을 것이다. 예를 들어 np로 numpy를 가져오고, pd로 pandas를 가져오는 것이 일반적인 관습이다.

import math
mt = math

math모듈의 모든 변수를 직접 참조할 수 있다면 좋지 않을까?
math.pi 혹은 mt.pi 가 아니라 pi를 직접 참조할 수 있다면? 그렇게 할수있다!

from math import *
print(pi, log(32, 2))


import *을 선택하면 접두사 없이 모든 모듈의 변수에 직접 액세스 할 수 있다.
그런데, 어떤 사람들은 이것에 대해서 좋지 않은 시선을 가지기도 한다.
그 사람들의 말도 일리가 있다.

from math import *
from numpy import *
print(pi, log(32, 2))

무슨 일이 벌어진 걸까? 

이런 종류의 import *은 가끔 이상하고 디버깅하기 어려운 상황으로 이어질 수 있다.

이 경우 문제는 math와 numpy모듈이 모두 log라는 함수를 가지고 있지만 의미론이 다르다는 것이다.
numy second에서 가져오기 때문에 해당 로그는 산술에서 가져온 로그 변수를 덮어쓴다.

적절한 타협점은 각 모듈에서 필요한 특정 항목만 가져오는 것이다.

from math import log, pi
from numpy import asarray

 

Submodules

모듈에는 함수나, 값을 참조할 수 있는 변수가 포함되어 있는 것을 확인했다. 
주의해야 할 점은 다른 모듈을 지칭하는 변수도 있을 수 있다는 점이다.

import numpy
print("numpy.random is a", type(numpy.random))
print("it contains names such as...",
      dir(numpy.random)[-15:]
     )

따라서 위와같이 numpy를 가져오면 랜덤"submodule"에서 함수를 호출하려면 두 개의 점이 필요하다.

# Roll 10 dice
rolls = numpy.random.randint(low=1, high=6, size=10)
rolls

 

Oh the places you'll go, oh the objects you'll see

ints, floats, bools, lists, string, dicts 를 살펴보았었다.
우리는 위에서 살펴본 것들말고도 다양한 라이브러리에서 작엽 유형을 직접 정의하여 작업해야한다.
예를들어 그래프 작성 라이브러리 matplotlib로 작업할 경우 하위 플롯, 그림 틱, 마크 및 주석을 나타내는 객체를 다루게된다.
pandas함수는 데이터 프레임 을 제공한다.

이 섹션에서는 이상한 타입을 다룰 수 있는 빠른 가이드를 알려준다.

Three tools for understanding strange objects

위의 셀에서, 우리는 숫자 함수를 호출하는 것이 우리에게 "array"를 제공한다는 것을 보았다.

1: type scape(이게 무엇입니까?)

type(rolls)

 

2: dir() (이걸로 뭘 할 수 있지?)

print(dir(rolls))

# If I want the average roll, the "mean" method looks promising...
rolls.mean()

# Or maybe I just want to turn the array into a list, in which case I can use "tolist"
rolls.tolist()

 

3: help() (관련된 추가 정보)

# That "ravel" attribute sounds interesting. I'm a big classical music fan.
help(rolls.ravel)

# Okay, just tell me everything there is to know about numpy.ndarray
# (Click the "output" button to see the novel-length output)
help(rolls)

help() 를통해 확인하는 것보다 온라인 문서를 통해 확인하는 것을 선호한다면 그것또한 가능하다!

[3, 4, 1, 2, 2, 1] + 10

위의 코드는 정말 바도같다. 당연히 오류가 발생한다.
하지만..

rolls + 10

우리는 파이썬이 +, <, in, == 또는 인덱싱 및 슬라이싱을 위한 대괄호와 같은 핵심 구문의 일부가 어떻게 작동하는지 엄격하게 통제한다고 생각할 수 있다. 그러나 실제로는 매우 손이 많이 가는 접근 방식이 필요하다. 새 유형을 정의할 때 추가가 작동하는 방식 또는 해당 유형의 개체가 다른 것과 동일하다는 의미를 선택할 수 있다.

목록의 디자이너는 목록을 숫자에 추가하는 것이 허용되지 않는다고 결정했다.
numpy 배열의 디자이너는 다른 방식으로 진행했다(배열의 각 요소에 숫자 추가).

다음은 Numpy array가 python연산자와 예기치 않게 상호작용 하는 방식에 대한 몇 가지 예다.

# At which indices are the dice less than or equal to 3?
rolls <= 3

xlist = [[1,2,3],[2,4,6],]
# Create a 2-dimensional array
x = numpy.asarray(xlist)
print("xlist = {}\nx =\n{}".format(xlist, x))

# Get the last element of the second row of our numpy array
x[1,-1]

# Get the last element of the second sublist of our nested list?
xlist[1,-1]

numpy의 ndarray는 다차원 데이터 작업에 특화되어 있으므로 인덱싱에 대한 자체 논리를 정의하여 튜플별로 인덱싱하여 각 차원에 인덱스를 지정할 수 있다.

When does 1 + 1 not equal 2?

딥러닝에서 널리 사용되는 python 라이브러리인 TensorFlow에 대해 들어본 적이 있을 것이다.
연산자 과부하를 광범위하게 사용한다.

import tensorflow as tf
# Create two constants, each with value 1
a = tf.constant(1)
b = tf.constant(1)
# Add them together to get...
a + b

(TensorFlow의 문서를 인용하면, a + b 는 2가 아니라..)
Operation의 출력 중 하나에 대한 기호 핸들이다.
해당 작업의 출력값을 보유하지 않지만 대신 TensorFlow의 tf.Session에서 해당 값을 계산하는 수단을 제공한다.

이러한 종류의 일이 가능하고, 라이브러리가 종종 명확하지 않거나 마술처럼 보이는 방식으로 연산자 오버로딩을 사용한다는 사실을 인식하는 것이 중요하다.

정수, 문자열 및 리스트에 적용될 때 python의 연산자가 작동하는 방식을 이해한다고 해서 tensorflow ,Tensor, numpy ndarray 또는 pandas DataFrame에 적용될 때 수행하는 작업을 즉시 이해할 수 있다는 보장은 없다.

예를들어 DataFrames에 대해 조금 알고 나면 아래와 같은 표현식이 매력적으로, 직관적으로 보이기 시작한다.

# Get the rows with population over 1m in South America
df[(df['population'] > 10**6) & (df['continent'] == 'South America')]

하지만, 왜 되는 걸까?
위의 예는 5개의 서로다른 오버로드된 연산자와 같은 기능을 제공한다.
각각의 작업은 무엇을 하고 있나?
일이 잘못되기 시작할 떄 답을 아는 것이 도움이 될 수 있다.

모든것이 어떻게 작동하는지 궁굼한가?
객체에 대해 help()또는 dir()을 호출하고 이중 밑줄이 있는 이름이 도대체 무엇인지 궁굼해 한 적이 있는가?

print(dir(list))

이는 연산자 오버로딩과 직접적이 관련이 있는 것으로 밝혀졌다.

python프로그래머는 연산자가 자신의 유형에서 동작하는 방식을 정의하려고 할 때 __it__, __contains__와 같은 2개의 밑줄로 시작하고 끝나는 특수 이름을 가진 메서드를 구현한다.
일반적으로 이 이중밑줄 형식을 따르는 이름은 python에 특별한 의미가 있다.

예를들어 x in [1, 2, 3]은 실제로 뒤에서 list method의 __contains__를 호출하고 있다. 

Day7의 exercise를 정리한 코드를 공유한다.
https://github.com/mgkim-developer/30-Days-of-ML-with-Kaggle/blob/main/30-days-of-ml-day-7.ipynb

 

GitHub - mgkim-developer/30-Days-of-ML-with-Kaggle: 30 Days of ML with Kaggle

30 Days of ML with Kaggle. Contribute to mgkim-developer/30-Days-of-ML-with-Kaggle development by creating an account on GitHub.

github.com

이렇게 해서 파이썬 기초코스가 끝났다.



반응형