posted by cimple 2017. 6. 28. 12:55

파이썬의 클래스나 함수에 대해 __doc__ 을 통하여 documentation 을 할 수 있다.

재미있는 것은 쌍따옴표 3개 """ 를 통해서도 가능한 것인데 다음 코드를 보면 알 수 있다.


def foo():
    """
    This is function!
    """
    return 

print function.__doc__
help(function)    


위와 같이 함수 맨 앞에 쌍따옴표 3개를 넣는 것만으로도 해당 함수에 대한 설명을 __doc__ 인자에 넣어줄 수 있다.



posted by cimple 2016. 3. 29. 17:26

Numpy 에 nonzero 라는 function 이 있다.


http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.nonzero.html#numpy.nonzero


document 를 봐도 헷갈리는 함수인데, non-zero 인 element 에 대하여 2D array 형태로 리턴하는 함수이다.


예를 들어

import numpy
arr = numpy.array([[1,0],[2,3]])
arr.nonzero()

이런 식으로 사용했을 때, 다음과 같은 결과를 얻게 될 것이다.

--> (array([0, 1, 1]), array([0, 0, 1]))

이 결과물이 낯설게 느껴질 수 있는데, input 으로 주어진 행렬에서 nonzero element 의 'index' 를 행과열을 각각 적은 것이다.


다시 말해서, input 으로 주어진 행렬(numpy array) 는 다음과 같다.


| 1   0 |

| 2   3 |


여기에서 0이 아닌 element 들의 행렬 index 는 다음과 같을 것이다. 행, 열의 성분을 보기 쉽도록 다른 색으로 표현했다.


(0,0), (1,0), (1,1)


numpy.nonzero 함수는 저 index 들에서 행은 행대로, 열은 열대로 따로 묶어서 리턴해주는 것이다. 


(0, 1, 1)

(0, 0, 1)


왜 이런 식으로 리턴하는가 하면, ([0,1,1], [0,0,1]) 형태의 튜플로 원래 array 에서 곧바로 element 를 뽑아올 수 있기 때문이다.


다시 말하면 위의 예제에서

arr[arr.nonzero()]
--> array([1, 2, 3])

이런 식으로 non-zero element 를 직접 접근할 수 있고, 이는

arr[[0,1,1],[0,0,1]]

로 직접 입력해 보면 같은 결과를 얻을 수 있음을 확인할 수 있을 것이다.





Numpy 의 where() 함수도 마찬가지이다.


http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.where.html


where() 함수는 condition 만 주어지면 condition 을 만족시키는 element 의 index 를 반환하는데, 이 때 반환하는 형식이 nonzero 함수와 동일하다.



posted by cimple 2016. 3. 16. 12:24

Github 사용은 할때마다 조금씩 느는것 같긴 한데 계속 헷갈리는 부분이 있는것 같다.

논문 작성을 다른 멤버들과 같이하기 위해서 논문작성 자체를 Github 를 통해서 진행하려고 한다.


1. 논문 texfile 이 있는곳에 create repository 를 하면 git 저장소가 된다.

2. 일단 master branch 로 initial commit 했다.

3. 내가 수정할 local branch 를 만들고, 거기에서 수정을 한 다음, master 에 merge 할 수 있다. Window 용 github 프로그램에서 손쉽게 할 수 있는데, merge 를 당할(?) branch 에 간다음, 특정 branch 와 compare 하고, 충돌이 없으면 merge 할 수 있다. (ex. master 로 checkout -> songjaewon branch 와 비교 -> 충돌없으면 merge)


4. 협업을 위해서는 github상에서 merge 절차를 하는게 맞아보인다.

5. github 저장소에서 branch 를 만들어 줄 수 있다. 또는, 내 repository 를 fork 한 사람이 나름 local branch 를 만든 다음 push 할 수도 있을 것이다.

6. 내 branch 와 master branch 를 비교해서 pull request 를 보낼수 있다. 문제가 없으면 master 가 merge 시켜주면 해당 버전으로 최신 업데이트 되는 것이다.


7. 내 local 에서는 sync 를 하면 master 의 최신내용으로 업데이트된다. 


(알아야 할 것. 내 master 와 github 의 master 가 서로 다를 경우 sync 를 시키면 어디를 기준으로 최신업데이트가 이루어지는지 궁금하다)


(알아야 할 것. 다른 사람이 올린 branch 를 내 local repository 에 끌고올수는 없는지 궁금하다.)

posted by cimple 2015. 11. 25. 20:29

File > Settings... > Project:  > Project Interpreter > 톱니바퀴 > More... > Show paths for the selected interpreter > Add path



posted by cimple 2015. 6. 3. 16:08

Read-the-docs 사용법


1. Read-the-docs 관련 패키지를 설치하고 환경변수에 등록해준다.

2. 내 파이썬 프로젝트에 docs 라는 폴더를 만든다.

3. sphinx-quickstart 를 하면 이런 저런 설정을 입력하면서 자동으로 환경을 구성해줌

4. make html 을 하면 빌드를 해줌(이 빌드과정은 read-the-docs 와는 상관없다. html 을 만들어 줌으로써 off-line 으로 확인해볼 수 있는 구조. read-the-docs 는 내 코드를 스스로 빌드한다.)

5. github 와 연동되어야 하므로 github repository 에 내 프로젝트 / Document 파일들을 push 해준다.

6. github 에 업로드하면 read the docs 사이트에서 import 해올 수 있음.


github 에 어떤 파일까지 올려야 하는가?

- read the docs 에 가면 내 document 의 관리 페이지에서 오른쪽 하단의 뱃지를 확인할 수 있다.

- 소스코드 / conf.py / index.rst / makefile 로는 no build 만 뜨는 상황.

- _build 폴더까지 같이 올리자 뱃지가 업데이트 되었다

- (하지만 build 는 필요 없을텐데?)


어떻게 소스코드와 연결할 수 있는가?

- 스핑크스가 모듈을 찾기 위해서, import 할 수 있어야 한다. 다시 말해, build 하는 system path 에 등록되어 있어야 한다는 이야기이다.


스핑크스의 작동원리

- Build 를 돌리면, doc 폴더 안에 내부적으로 document 가 생성되게 된다.

- 이 HTML 파일을 그대로 사용하면 바로 그것이 document 가 되는 것이다.

- 그런데 Read the Docs 웹사이트에서 이게 가능하려면, 그 사이트에서 내 document 코드를 빌드할 수 있어야 한다.

- 그렇다면 그 웹사이트 상에서 내 코드를 빌드할 수 있도록 path 를 등록해 주어야 한다. 상대적인 경로로...


Read the Doc 테마 적용방법

- conf.py 파일에서 html_theme 을 찾아서 코멘트시켜 버리고, 다음 코드를 추가한다.

# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
# only import and set the theme if we're building docs locally
if not on_rtd:
    import sphinx_rtd_theme
    html_theme = 'sphinx_rtd_theme'
    html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]

주석에 적혀있는 대로, online 에서 바로 테마를 가져오던가, 아니라면 local 에서 build 할때 테마를 적용할 수 있다.


C++ 의 사용

- autodoc 을 사용하기 위해서는 doxygen 과 sphinx 를 연결시켜주는 breathe 라는 도구를 활용하게 된다. 추후에 공부가 더 필요할 것.


외부 라이브러리의 import

- Read the Docs 문서에도 설명되어 있지만, RtD 는 사용자의 파이썬 코드를 한번 컴파일하면서 문서를 빌드하기 때문에 라이브러리 의존성이 있다. 따라서 numpy 와 같은 외부라이브러리를 사용한다면 빌드과정에서 에러가 생기게 된다.

여기에 대한 해결방식은 아래 RtD 문서에서 설명하고 있다. 

https://docs.readthedocs.org/en/latest/faq.html#i-get-import-errors-on-libraries-that-depend-on-c-modules

방식을 간단하게만 설명하면, import 하는 라이브러리들을 mock 모듈을 사용해서 가상으로 import 하는 것이다. 어차피 실제로 돌아갈 필요는 없으니까.

- 여기서 알수 있는건, 코드가 실제로 돌아가서는 안된다는 것이다. 즉, 업로드되는 코드가 클래스 및 함수 형태가 되어야지 __main__() 함수 실행같은것을 코드상에 포함시켜서 실제로 돌아가면 에러를 발생시키게 된다.


한글 사용

- conf.py 파일에서 language 옵션을 'ko' 로 주게되면 기본메뉴가 한글로 뜨게 되는데 큰 의미는 없다.

- Sphinx 는 유용한 Internationalization 기능을 지원하는데, 하나의 언어로 작성된 문서를 다른 언어로 번역하여 빌드할 수 있다. 

- 그러나, 사실 개인이 진행하는 소규모 프로젝트에서 이 정도로 문서를 구성하는 것은 무리한 일이 될 수 있어서, 기본적으로 영문이나 한글 둘중의 하나를 선택하여 작성하는 정도로 마무리하려고 한다.

- 한글을 꼭 사용하고 싶으면 python 소스파일 상단에는 

#-*- coding: utf-8 -*-

를 추가하고, conf.py 의 source_encoding 옵션을

source_encoding = 'cp949'

로 바꿔주면 한글 문서작성 및 autodoc 이 가능해진다.

- html 은 온라인빌드/오프라인 빌드 둘다 잘 되는데, pdf 빌드가 깨진다. 이 옵션도 conf.py 에서 잡아주면 될것 같은데 당장 꼭 필요한 옵션같지는 않다...

posted by cimple 2015. 6. 2. 16:06

자주 사용하게 되는 Numpy 테크닉들


1. 두 Numpy Array 비교


(A == B).all()


2. 똑같은 숫자로 Column vector 만들기


a = np.empty(5)  # create empty array with size 5

a.fill(2.0)   # fill it with 2.0

a.shape = (len(a),1)  #reshape as column vector


posted by cimple 2015. 5. 27. 15:20

FreeType 은 font 와 관련된 정보를 손쉽게 추출하고 render 하기 위한 라이브러리이다. 다양한 분야에 폭넓게 응용될 수 있는 라이브러리인데, 설치 및 Python 인터페이스를 설정하는 방법에 대해 설명하겠다.


1. Freetype 홈페이지에서 소스코드를 다운로드를 받는다.


[다운로드 페이지 링크]


링크에 들어가면 Freetype 소스코드 패키지를 받을 수 있는 링크와, Winodws 사용자를 위한 바이너리 링크가 준비되어 있다. 그런데 바이너리 배포판은 Python 인터페이스 연동이 잘 되지 않아서, 직접 컴파일해서 라이브러리를 만들어 사용하도록 하자.


2. 패키지를 다운로드 받은 후 압축을 풀면, builds 폴더에 다양한 플랫폼에 대한 빌드 환경을 제공한다. windows 폴더에 들어가 보면 VS 버전별로 솔루션 파일까지 제공하는 친절함을 보여준다. 필자는 Visual Studio 2010 버전을 사용하였다.


3. 솔루션을 연 다음 그대로 컴파일해도 .lib static library 파일을 생성해서 사용할 수 있다. 


4. 그러나 우리는 python 인터페이스를 사용하기 위해서 .dll dynamic library 파일을 생성해야 하는데, 몇 가지 사전 준비작업이 필요하다.

(도움 링크 : http://stackoverflow.com/questions/6207176/compiling-freetype-to-dll-as-opposed-to-static-library)


5. 먼저 프로젝트의 속성>일반에 들어가서 '구성 형식' 을 '동적 라이브러리(.dll)' 로 바꿔준다.

6. 다음 ftoption.h 파일을 열고, 다음 두 라인을 "DLL export compilation" 섹션 근처에 삽입해준다.


#define FT_EXPORT(x) __declspec(dllexport) x
#define FT_BASE(x) __declspec(dllexport) x


7. project configuration 을 'Release' 로 바꾸어준 후, 빌드한다.

8. freetype255.dll, freetype255.lib 등 'freetypeXXX' 형태로 라이브러리가 빌드된 것을 확인할 수 있다. 우리의 동적 라이브러리에서 숫자 부분을 지우고, 'freetype.dll' 형태로 파일명을 바꾼다.


9. 다음 링크에서 freetype-py 의 최신 버전을 다운로드 받을 수 있다. 오른쪽의 'Download ZIP' 으로 한꺼번에 다운로드 한다.


[다운로드 페이지 링크] 


10. 다운받은 패키지에서 freetype 폴더를 파이썬 라이브러리 패키지 폴더 (ex. C:\Python27\Lib\site-packages) 에 복사한다.


11. freetype.dll 파일을 현재 파이썬 스크립트가 있는 폴더에 복사한다.

Notice: Document 에는 윈도우즈 시스템 폴더(C:\Windows\System32) 에 복사하라고 되어 있는데 ctypes.util.find_library('freetype') 로 찾는 패스가 제대로 작동하지 않는 것 같다. 확인요함. 도큐먼트 오류인듯.


12. Python console 을 열고,


import freetype


을 입력한 후 정상적으로 import 되면 성공이다.


13. 다음 Documentation 을 참고하며 연습해보자.


http://freetype-py.readthedocs.org/en/latest/

posted by cimple 2015. 5. 22. 17:42

OpenCV Python 버전이 있습니다. Google Summer of Code 2013 에서 Alexander Mordvintsev 라는 사람의 지도하에 Abid Rahman K. 에 의해서 시작된 프로젝트라고 하네요. 

Computer Vision Problem 을 빠르게 Prototyping 해 보는데 좋은 도구인 것 같습니다.


튜토리얼 웹페이지는 아래와 같고요,


https://opencv-python-tutroals.readthedocs.org/en/latest/index.html


물론 Installation 가이드도 있지만 설치에 오류가 있는 부분도 있어서 다시 링크로 설명드립니다. 


Notice: 모든 인스톨 패키지는 32bit 기준으로 작성되었습니다. 64bit 버전으로 인스톨하고 싶으시다면 위 튜토리얼의 윈도우 인스톨 페이지를 참조하시기 바랍니다.






1. 아래에 있는 패키지들을 다운로드 받고, 기본 위치에 인스톨합니다. 


- Python-2.7.x

- Numpy

- Matplotlib (optional, but recommended)


Python 의 경우 C:\Python27\ 에 설치될 것입니다.

Numpy 의 경우 위 튜토리얼 페이지에 링크된 버전을 사용하면 이후에 OpenCV 를 설치할때 버전이 다르다는 오류메시지를 만나게 됩니다. 제가 링크한 버전을 사용하세요.

Matplotlib 는 필수는 아니지만, 위 튜토리얼 페이지에 있는 튜토리얼들을 따라할때 필요합니다.



2. 인스톨이 완료되면 Python IDLE 를 열고, 

import numpy

를 입력해서 numpy 가 정상적으로 import 되는지 확인합니다.



3. 아래 링크에서 최신 OpenCV 버전을 다운로드 받습니다. 


- OpenCV Release


실행 파일 형태로 되어있는데, 실행시키면 압축을 풀 수 있습니다.



4. 압축을 풀어놓은 폴더에서 opencv/build/python/2.7/x86 에 가면 cv2.pyd 파일이 있습니다. 이 파일을 C:/Python27/lib/site-packeges. 에 복사합니다.


5. Python IDLE 를 열고, 다음을 입력해서 정상적으로 설치되었는지 확인합니다.

import cv2
print cv2.__version__

OpenCV 버전이 잘 출력되면 성공적으로 인스톨 된 것입니다.


이후로는 위 튜토리얼 사이트를 참고하시면서 활용하세요!

posted by cimple 2014. 12. 30. 17:34

Numpy 를 설치할 때 멀쩡히 Python 2.7 버전이 설치되어 있음에도 Python version 2.7 required, which was not found in the registry" 오류가 뜰 때가 있다.


원인은 여러 가지가 있는데 기존 2.6버전이 설치되어 있을 경우, 또는 Python 2.7 버전의 설치파일에 문제가 있다는 원인(...?) 등등이 예상되는데


해결방법은 윈도우 레지스트리 수정을 통해서 해결할 수 있다.


http://belitino.tistory.com/132


해결은 위 링크의 도움을 받아서 해결할 수 있었고...


요약하면 


HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Python\PythonCore\2.7\InstallPath


라는 키를 생성해서 데이터를 


HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath


안에 있는 패스 데이터 값으로 지정해 주면 된다. (아마 C:\Pyton27\ 일 것임)



Wow6432Node 가 뭐지.... 신기하다.

posted by cimple 2013. 11. 20. 21:23

특정 List 에서 어떤 member 가 있는지를 찾아보는 계산에서는 set 이 더 유용하다.


예를 들어


a = []
for i in range(10000):
    a.append(i)


이렇게 list 를 만들었다고 했을때, 특정 member 가 list 에 있는지 찾아보는 방법에는


if 22 in a : print "True"


와 같은 방식으로 찾을 수 있을 것이다. 그러나 이러한 "x in list" 계산은 O(n) 의 complexity 를 갖는다. 이럴 경우 set() 을 사용하면 O(1) 의 time complexity 로 검색이 가능하다.


aSet = set(a)
if 22 in aSet : print "True"


이렇게 해주면 좀더 효율적으로 검색할 수 있다. (그런데 실제적으로 이 예제에서는 계산시간을 눈에 띄게 확인하기는 어렵다..)