glob() 기능

  • glob() 함수는 파라미터에 명시된 저장 경로와 패턴에 해당하는 파일명을 리스트 형식으로 반환한다.
  • 단, 조건에 정규식을 사용할 수 없으며 *와 ? 같은 와일드카드만 지원한다.

 

'*' 사용하기

'*'는 임의의 길이의 모든 문자열을 의미한다.

file_path = glob.glob('dir/*.csv')

: dir폴더에 csv 파일들의 이름만 file_path에 리스트에 저장된다.

 

'?' 사용하기

'?'는 한자리의 문자열을 의미한다.

file_path = glob.glob('dir/file?.csv')

: dir폴더에 file_.csv 파일들의 이름만 file_path에 리스트에 저장된다.

 

하위 디렉토리 파일까지 전부 다 찾기

recursive=True로 설정하고 '**'를 사용하면 모든 하위 디렉토리까지 탐색한다.
기본값은 False이며, 파일이 너무 많을 경우에 사용하면 과도한 cost가 소모된다고 한다.

file_path = glob.glob('dir/**', recursive=True)

: dir와 하위 폴더의 모든 파일들의 이름이 file_path에 리스트에 저장된다.

 

 

[Python] glob.glob() 사용법

1. 개요 많은 파일들을 다뤄야 하는 파이썬 프로그램을 작성할 때, 특정한 패턴이나 확장자를 가진 파일들...

blog.naver.com

 

파이썬 머신러닝, 딥러닝 모델을 개발할 때, 호출 당시 인자값을 줘서 동작을 다르게 하고 싶은 경우가 있습니다.(하이퍼 파라미터 관리)

이때, 파이썬 내장함수인 argparse 모듈을 사용하여 원하는 기능을 개발할 수 있습니다.

 

사용법

먼저, 다음과 같은 python file 을 만든다.

import argparse

# 인자값을 받을 수 있는 인스턴스 생성
parser = argparse.ArgumentParser(description='Argparse Tutorial')

# 입력받을 인자값 설정 (default 값 설정가능)
parser.add_argument('--epoch',          type=int,   default=150)
parser.add_argument('--batch_size',     type=int,   default=128)
parser.add_argument('--lr_initial',     type=float, default=0.1)

# args 에 위의 내용 저장
args    = parser.parse_args()

# 입력받은 인자값 출력
print(args.epoch)
print(args.batch_size)
print(args.lr_initial)

이후, 터미널에서 파이썬 파일을 실행 시키면 아래와 같은 결과를 보여준다.

 

파이썬 파일 실행 방법은 python 파일이름.py 로 실행할 수 있다.

# python 파일을 터미널에서 실행 시킨다.

$ python argparse_example.py 

  150  # default epoch
  128  # default batch size
  0.1  # default learning rate


# 뒤쪽에 -h 또는 --help 를 붙이면 내용에 대해서 보여준다.

$ python argparse_example.py -h 

  usage: argparse_example.py [-h] [--epoch EPOCH] [--batch_size BATCH_SIZE]
                             [--lr_initial LR_INITIAL]

  Argparse Tutorial

  optional arguments:
    -h, --help            show this help message and exit
    --epoch EPOCH
    --batch_size BATCH_SIZE
    --lr_initial LR_INITIAL


# 다음과 같이 명령시에 직접 값을 설정해 적용할 수 있다.

$ python argparse_example.py --epoch=256 --batch_size 64 --lr_initial 0.1111

  256    # epoch
  64     # batch_size
  0.1111 # learning rate 
  

 

일반적인 머신러닝에서 위의 모듈을 사용하는 방법은 다음과 같다.

 

  •   main.py  :  모델 학습/평가가 수행되는 파이썬 코드                             ( run in python)
  •   main.sh  :  main.py 에 특정한 하이퍼 파라미터를 부여하는 코드    ( run in shell )
# main.py

import argparse

# 인자값을 받을 수 있는 인스턴스 생성
parser = argparse.ArgumentParser(description='Argparse Tutorial')

# 입력받을 인자값 설정 (default 값 설정가능)
parser.add_argument('--epoch',          type=int,   default=150)
parser.add_argument('--batch_size',     type=int,   default=128)
parser.add_argument('--lr_initial',     type=float, default=0.1)

# args 에 위의 내용 저장
args    = parser.parse_args()

# 입력받은 인자값 출력
print(args.epoch)
print(args.batch_size)
print(args.lr_initial)
# main.sh

# 본인이 원하는대로 값을 설정해줄 수 있다.

python argparse_example.py  # default value
python argparse_example.py --epoch=200 --batch_size=256 --lr_initial=0.3
python argparse_example.py --epoch=300 --batch_size=64 --lr_initial=0.03
python argparse_example.py --epoch=400 --batch_size=32 --lr_initial=0.003

 

위와 같은 .py .sh 파일을 만든 후 터미널에서 다음과 같이 sh 파일을 실행 시켜준다.

 

$ sh main.sh

  # 결과
  150    # default epoch
  128    # default batch size
  0.1    # default learning rate

  200    # epoch
  256    # batch size
  0.3    # learning rate

  300    # epoch
  64     # batch size
  0.03   # learning rate

  400    # epoch
  32     # batch size
  0.003  # learning rate

 

ArgumentParser()

해당 객체에는 아래와 같이 입력받고 있습니다.

  • prog: 프로그램의 이름 (기본값: sys.argv[0])
    • 기본값으로 실행한 스크립트파일명을 노출. 작성 시 스크립트 파일 대신 입력한 값이 노출
  • usage: 프로그램 사용법을 설명하는 문자열 (기본값: 파서에 추가된 인자로부터 만들어지는 값)
    • 사용방법을 노출.  기본값으로 실행한 파일 + 입력한 인자값들을 노출
  • description: 인자 도움말 전에 표시할 텍스트 (기본값: none)
    • 스크립트에 -h 옵션을 주어 실행 시, usage 아래에 노출
  • epilog: 인자 도움말 후에 표시할 텍스트 (기본값: none)
  • parents: ArgumentParser 객체들의 리스트이고, 이 들의 인자들도 포함
  • formatter_class: 도움말 출력을 사용자 정의하기 위한 클래스
  • prefix_chars: 선택 인자 앞에 붙는 문자 집합 (기본값: '-').
  • fromfile_prefix_chars: 추가 인자를 읽어야 하는 파일 앞에 붙는 문자 집합 (기본값: None).
  • argument_default: 인자의 전역 기본값 (기본값: None)
  • conflict_handler: 충돌하는 선택 사항을 해결하기 위한 전략 (일반적으로 불필요함)
  • add_help: 파서에 -h/--help 옵션을 추가 (기본값: True)
  • allow_abbrev: 약어가 모호하지 않으면 긴 옵션을 축약할 수 있도록 함. (기본값: True)

 

add_argument()

해당 메서드는 아래와 같이 입력받고 있습니다.

  • name or flags: 옵션 문자열의 이름이나 리스트, 예를 들어 foo 또는 -f, --foo.
  • action: 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형.
  • nargs: 소비되어야 하는 명령행 인자의 수.
  • const: 일부 action 및 nargs 를 선택할 때 필요한 상숫값.
  • default: 인자가 명령행에 없는 경우 생성되는 값.
  • type: 명령행 인자가 변환되어야 할 형.
  • choices: 인자로 허용되는 값의 컨테이너.
  • required: 명령행 옵션을 생략 할 수 있는지 아닌지 (선택적일 때만).
  • help: 인자가 하는 일에 대한 간단한 설명.
  • metavar: 사용 메시지에 사용되는 인자의 이름.
  • dest: parse_args() 가 반환하는 객체에 추가될 어트리뷰트의 이름.

파이썬 함수 선언부에 보면 args, kwargs를 가끔 볼 수 있다.

args는 정해지지 않은 수의 (일반)파라미터를 받고

kwargs는 정해지지 않은 수의 키워드파라미터를 받는다.

예를들어 myFunc를 선언하고 호출해보자.

먼저 args에 대해서 알아보자. 별표(*)1개와 함께 입력한다.

파라미터수를 정하지 않았으므로 없거나, 1개, 2개, 3개 등 모두 가능하다.

그러면 리스트도 전달 가능할까? 아래처럼 호출하면 가능하다.

 

다음으로 kwargs에 대해서 알아보자. 별표 2개(**)와 함께 입력한다.

키워드파라미터에 없거나, 여러 개를 입력할 수 있다.

만약 (일반)파라미터와 키워드파라미터를 둘다 받고 싶다면 아래와 같이 선언한다.

리스트를 사용하여 전달하고자 한다면 아래와 같이 할 수 있다.

마지막으로 위에서 사용했던 args와 kwags는 다른 변수명으로 바꿀 수 있다.

그러나 가독성을 위해 args(=arguments), kwargs(=keyword arguments)를 위해

그대로 사용하는 것을 권장한다.

iterable

python에서 'iterable 하다'라는 의미는 뜻 그대로 '반복 가능한' 것을 의미하며, 반복 가능한 데이터 즉, 객체에 적용되는 의미입니다. 반복가능한 객체의 종류로는

- 순서형 및 컬렉션 데이터 타입 : string, list, tuple, dict, set, range() 함수객체

- 그 외 : 파일, class로 컬렉션 데이터로 정의된 객체 등

 

iterator

이터레이터는 순서대로 다음 값을 리턴할 수 있는 객체를 의미합니다. 자체적으로 내장하고 있는 next 메소드를 통해 다음 값을 가져올 수 있습니다.

여기서 '순서대로'라는 말 때문에 list, tuple과 같은 타입의 객체를 생각하셨을 수도 있는데, 이것과는 다릅니다.

 

iterable vs iterator

내부 요소(member)를 하나씩 리턴할 수 있는 객체를 보고 Iterable하다고 합니다. 쉽게 생각하면 우리가 평소에 많이 사용하는 for문을 떠올리시면 됩니다.

_list = [1,2,3,4,5]

for i in _list:
    print(i)

이렇게 for문을 통해 순회할 수 있는 객체를 Iterable하다고 생각하시면 됩니다. 대표적으로 위에서 잠깐 설명한 시퀀스 타입 컬렉션 타입의 객체가 있습니다.

그럼 Iterable한 것과 Iterator는 무슨 차이가 있는걸까요?

쉽게 말하자면 Iterable한 것은 __next__ 메소드가 존재하지 않고 Iterator는 존재한다고 생각하시면 됩니다.

 __next__ 메소드로 다음 값을 반환할 수 있으면 Iterator, 없으면 Iterable한 객체입니다.

 

iterable 객체를 iteraotor로 변환 가능

주목할 점은, Iterable한 객체를 Iterator로 만들 수 있다는 점입니다.(정확히는 내부에 __iter__라는 메소드가 있는 객체)

예제와 함께 살펴봅시다.

a = [1, 2, 3]

print(a.__next__) # AttributeError 발생

그냥 list 타입의 데이터는 __next__ 메소드가 없습니다. 따라서 에러가 발생합니다.

a = [1, 2, 3]

print(type(a)) # list 출력
a = iter(a)
print(type(a)) # list_iterator 출력
print(a.__next__()) # 첫 실행시 1 출력

하지만 이렇게 iter함수를 이용해 Iterator로 만들어 줄 수 있습니다.

Iterator로 바꾼 후에는 정상적으로 __next__함수가 작동하는 것을 볼 수 있습니다.

a = [1, 2, 3].__iter__()
print(type(a)) # list_iterator

또는 이렇게 직접 __iter__ 메소드를 호출해 Iterator로 만들어 줄 수도 있습니다.

a = [1, 2, 3]

a = iter(a)
print(a.__next__()) # 1 출력
print(a.__next__()) # 2 출력
print(a.__next__()) # 3 출력
print(a.__next__()) # StopIteration Exception 발생

저 __next__메소드를 이용해서 값을 계속 꺼내다보면 마지막 값에 도달하게 되는데, 마지막 값을 꺼내고 나서 __next__메소드를 호출하면 StopIteration이라는 예외가 발생합니다.

 

for문과 iterator

눈치채신 분도 계시겠지만 파이썬의 for문은 내부적으로 Iterator를 생성하여 동작합니다.(__iter__ 메소드 이용)

예를들어 리스트를 순회하는 for문이라 하면, 해당 리스트의 Iterator를 생성한 다음 __next__메소드를 이용해 순회를 도는 방식입니다.

대충 그림으로 표현하자면 다음과 같습니다.

StopIteration 예외가 발생하면 순회를 마칩니다.

 

* 파이썬은 대부분의 라이브러리가 이미 다른 사용자에 의해서 구현되어 있음 (파이썬의 장점)

 

* 남이 만든 프로그램 쓰는법 객체 < 모듈

 

* 모듈과 패키지

 

* 패키지 : 여러 모듈을 모아놓은 단위, 하나의 프로그램

새 창에서 열기

* 어떻게 행렬과 매트릭스를 코드로 표현할 것인가?

-> 파이썬 과학 처리 패키지 numpy

 

* numpy

- 파이썬의 고성능 과학 계산용 패키지

- matrix와 vector와 같은 array 연산의 사실상의 표준

 

* numpy 특징

- 일반 list에 비해 빠르고, 메모리 효율적

- 반복문 없이 데이터 배열에 대한 처리를 지원

- 선형대수의 대부분의 개념을 numpy로 구현 가능

 

* ndarray

- numpy는 np.array 함수를 활용해 배열을 생성

- numpy는 하나의 데이터 type만 배열에 넣을 수 있음

- shape : numpy array의 dimension 구성을 반환함

- dtype : numpy array의 데이터 type을 반환함

 

* array shape

- scalar : 차원x, 7

- vector : 1차원, [10,10]

- matrix : 2차원, [[10,10],[15,14]]

- 3-tensor : 3차원

- n-tensor : n차원

 

* array reshape

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

- .reshape(-1,2) => -1 : size를 기반으로 row 개수 선정 

 

* flatten

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

 

* indexing for numpy array

- list와 달리 이차원 배열에서 [0,0] 표기법을 제공

- matrix 경우 앞은 row 뒤는 column 의미

* slicing for numpy array

- list와 달리 행과 열 부분을 나눠서 slicing이 가능

- matrix의 부분 집합을 추출할 때 유용

 

* np.arange

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

* ones, zeors and empty

- zeros : 0으로 가득찬 ndarray 생성

- ones : 1로 가득찬 ndarray 생성

- empty : shape만 주어지고 비어있는 ndarray 생성

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

* np.identity

- 단위 행렬 (i 행렬)을 생성함

* np.eye

- 대각선이 1인 행렬, k 값으로 시작 index  변경 가능

* np.diag

- 대각 행렬의 값을 추출

* np.random(random sampling) 

- 데이터 분포에 따른 sampling으로 array를 생성

 

* sum, mean, std

- ndarray의 element들 간의 합을 구함, list의 sum기능과 동일

* axis

- 모든 operation function을 실행할때 기준이 되는 dimension 축

* concatenate

- numpy array를 합치는 함수

 

* operations b/t arrays

- numpy는 array간의 기본적인 사칙연산 지원

- array간 shape이 같을때 일어나는 연산 (element-wise operations)

* Dot product

- Matrix의 기본연산, np.dot 사용

* transpose

- transpose 또는 T attribute 사용

* broadcasting

- shape이 다른 배열간 연산을 지원하는 기능 (펴져나가는 기능)

Comparison all & any

- Array의 데이터 전부(and) 또는 일부(or)가 조건에 만족 여부 반환

- numpy는 배열의 크기가 동일 할 때 element 간 비교의 결과를 Bㅐolean type으로 반환

np.where

numpy data i/o

+ Recent posts