최근에 python study를 하면서 정리도 할겸 포스팅을 하기로 했다. 잊지 않으려면, 나중에 찾아보려면 이렇게 기록으로 남기는것이 최선일 것이다.

1. Basic Indexing and Slicing

In [51]: arr = np.arange(10)

In [52]: arr

Out[52]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [53]: arr[5]

Out[53]: 5

In [54]: arr[5:8]

Out[54]: array([5, 6, 7])

In [55]: arr[5:8] = 12

In [56]: arr

Out[56]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])


 python에서 slicing을 할 경우 마지막 index는 수학 표현으로 치면 개구간이다. In[54]의 결과를 보면 8은 결과에 포함되어 있지 않음을 알 수 있다. 

다음은 Numpy에서 array를 call by reference로 처리하고 있다는 것을 보여주는 예제이다.

In [57]: arr_slice = arr[5:8]

In [58]: arr_slice[1] = 12345

In [59]: arr

Out[59]: array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])

 혹여 이런식으로 'view'를 생성해서 원래 값과의 연결됨을 원치 않는다면 arr_slice = arr[5:8].copy() 명령어를 사용하면 된다.

2. Expressing Conditional Logic as Array Operations

numpy.where function은 어떤 조건에 따라 x 혹은 y를 경우게 맞게 빠르게 보여주는 기능을 제공한다. Python에 기본적으로 탑재되어 있는 기능을 사용하면 다음과 같이 구현해야 한다.

In [143]: result = [(x if c else y)

.....: for x, y, c in zip(xarr, yarr, cond)]

In [144]: result

Out[144]: [1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]

 이 방법은 large array에 대해서 빠르지 않을 뿐더러 multidimensional arrays에 적합하지 않다. numpy.where 함수를 쓰면 다음과 같이 구현 가능하다.

In [145]: result = np.where(cond, xarr, yarr)

In [146]: result

Out[146]: array([ 1.1, 2.2, 1.3, 1.4, 2.5])

numpy.where는 반드시 array를 필요로 하지 않는다.

In [147]: arr = randn(4, 4)

In [148]: arr

Out[148]:

array([[ 0.6372, 2.2043, 1.7904, 0.0752],

[-1.5926, -1.1536, 0.4413, 0.3483],

[-0.1798, 0.3299, 0.7827, -0.7585],

[ 0.5857, 0.1619, 1.3583, -1.3865]])

In [149]: np.where(arr > 0, 2, -2)

Out[149]:

array([[ 2, 2, 2, 2],

    [-2, -2, 2, 2],

    [-2, 2, 2, -2],

    [ 2, 2, 2, -2]])

이런식으로 where에 자유롭게 input을 입력하여 사용할 수 있다.

3. Mathematical and Statistical Methods

Numpy에서는 sum, mean, std 같은 수학적 연산 함수를 제공한다. 

In [151]: arr = np.random.randn(5, 4) # normally-distributed data

In [152]: arr.mean()

Out[152]: 0.062814911084854597

In [153]: np.mean(arr)

Out[153]: 0.062814911084854597

In [154]: arr.sum()

Out[154]: 1.2562982216970919

mean(), sum()과 같이 method에 인수를 지정하지 않으면 대상 array에 모든 값을 대상으로 수학연산을 행한다. 그런데 method에 인수로 정수값을 할당하면 'axis'를 따라 연산을 행한다. 예를들면 다음과 같다.

In [157]: arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])

In [158]: arr.cumsum(0)                 In [159]: arr.cumprod(1)

Out[158]:                                     Out[159]:

array([[ 0, 1, 2],                           array([[ 0, 0, 0],

   [ 3, 5, 7],                                     [ 3, 12, 60],

   [ 9, 12, 15]])                                [ 6, 42, 336]])

cumsumcumprod는 이름에서 알 수 있듯이 누적해서 합, 곱을 해주는 method이다. 여기서 좀 헷갈렸던 점이 'axis'를 따라 연산을 한다는 점이었다. 보통 2d-array를 취급할 때 앞에 오는 숫자가 대부분 행, 뒤 숫자가 열을 의미하기에 결과를 보기 전에 cumsum(0)을 입력하면 [0,1,3],[3,7,12] 이런식으로 출력이 될거라고 예상했었다. 그런데 'axis'를 따라서 연산한다는 의미를 잘 생각해보면 x축, y축 처럼 그 축위를 움직이면서 그 위치에 해당하는 값들에 대해 연산해 준다는 것이었다. 설명은 명확히 쓰여 있었으나 그 동안 해오던 것과 달라서 헷갈렸던 부분이었다.

최근에 "Python for Data Analysis" 라는 책을 이용하여 python study를 시작하게 되었다. 이 책에서 가장 먼저 공부하기로 한 부분은 Chapter 4. NumPy Basics: Arrays and Vectorized Computation이다. 이 Chapter의 내용을 실습해보려면 numpy를 설치해야 하는데 이 부분에서 자꾸 에러가 발생하였다. 내가 사용한 명령어는 다음과 같다.

python -m pip install numpy

 Powershell에서 위의 명령어를 입력하면 뭔가 설치되는 듯 하다가 에러가 발생하였다. 에러 내용은 ~~를 찾을 수 없다.. 뭐 이런식이었다. 언제나 그렇듯 막힌 부분을 해결하기 위해 구글링을 하다보니 많은 사람들이 나와 같은 문제를 겪어왔다는 것을 확인할 수 있었다. 내가 numpy 설치를 시도한 노트북과 내 연구실의 PC모두 64비트 컴퓨터여서 에러가 발생하는 것이었다. 검색을 하다가 http://goo.gl/HG1Q1o 이 블로그에서 64비트 컴퓨터에 numpy를 설치하는 방법을 알게되었다. 

 그러나 이 때, 연구실 친구가 winPython을 써보라는 조언을 해주었다. winPython을 설치하면 유용한 package들이 한꺼번에 몽땅 설치된다는 것이었다. 그래서 구글에서 winpython을 입력하여 홈페이지에 접속해 보았더니 이 페이지에서는 친절하게 64비트용 유저를 위한 버전도 구별해서 설치파일을 올려두고 있었다.

 설치 파일을 다운 받고 본격적으로 책에 있는 내용을 실습해보려고 하니 아직도 numpy를 찾을 수 없다고 한다. 문제는 환경변수였다. winPython을 설치했지만 지금 내 PC에서 인식하고 있는 python은 얼마 전에 설치한 'C:\Python' 에 있는 파일들이었다. 서 이 파일들을 지우고 winPython이 설치된 폴더에서 python 실행파일이 있는 하위 폴더를 환경 변수에 추가해주고 Scripts 폴더도 추가해주니 powershell에서 아주 훌륭하게 작동하였다.

winPython을 설치하고 나면 설치되는 package들 (더 있지만 그림 크기상 담지 못하였음)

 위와 같이 package들을 설치해준다. 또한 이 책에서 실습용으로 사용하는 IDE인 iPython도 제공한다. winPython을 설치한 뒤에 shell에서 ipython을 입력하면 된다. winPython 정말 유용하다.


요즘 'Learn python the hard way'를 통해서 python을 공부하던 중 46번째 exercise에서 막혔다.

이 과정에서 1번부터 어떻게 하는지 몰라서 다음 과정을 진행하지 못했었다. 1번의 경우 아직 어떤 package도 설치되어 있지 않은 상태이기 때문에 저 링크를 통해 들어간 웹사이트에서 get-pip.py라는 파일을 직접 다운로드를 받아서 실행해야 되는 것이었다. get-pip.py를 실행하고 나서 환경 변수 설정을 마치면 설치가 완료된다. 환경 변수는 두 가지 방법으로 설정할 수 있다.

1. 시스템 > 고급 시스템 설정 > 환경 변수 > Path 에 도달한 뒤 편집을 하는 방법

경로 뒤에 ;을 붙이고 파이썬 설치 경로에 \Scripts 을 붙이고 추가해주면 된다.

2. 명령어로 직접 설정하는  

[Environment]::SetEnvironmentVariable("Path","$env:Path;C:\Python27\Scripts", "User") 을 shell에서 직접 입력하면 된다.

위와 같이 환경 변수를 설정해야 하는 이유는 pip 파일이 없는 곳에서도 pip를 사용할 수 있게 하기 위함이다.

이렇게 pip를 설치하면 2, 3, 4번에 나와있는 'distribute', 'nose', virtualenv' package들은 다음과 같은 명령어로 쉽게 설치 할 수 있다.

python -m pip install 'SomePackage'

모든 package의 설치를 마치고나서 exercise46의 지시사항데로 디렉토리와 파일을 작성하고 test를 해보았으나 또 에러가 발생하였다.

이 에러와 관련해서 검색을 많이 해봤지만 대부분의 답변이 package들을 제대로 설치하라는 것이었다. 내 경우는 이미 설치는 제대로 되어 있어서 원인이 무엇일까 생각해 본 결과 '권한의 문제가 아닐까'라는 생각을 하게 되었다. 리눅스의 경우는 실행하려는 명령어 앞에서 'sudo'를 붙이면 관리자 권한을 실행이 되는데 windows의 powershell에서는 이것을 가능하게 하는 방법을 찾던 중 다음과 같은 두 가지 방법을 알아냈다.

1. Powershell을 우클릭한 후 관리자 권한으로 실행

2. Powershell을 실행하고  Start-Process powershell -Verb runAs를 입력

위 두 방법 중 한 가지를 택해서 powershell을 실행하고 테스트를 한 결과는 다음과 같다.

learn python 홈페이지에 나와있는 결과물을 그대로 확인 할 수 있다.


얼마전 연구실에서 실험을 돌릴 때 특정 index에 해당하는 문제를 대상으로 프로그램을 돌려야 하는 일이 있었다.
인덱스를 쿼리로 따로 뽑아서 돌려도 되지만 view형태로 만들어서 출력해 놓으면 일도 분담할 수 있고 보다 보기 편할 거 같아서 view를 생성해 두었다.

그런데 친구가 묻기를 

'view와 table이 어떻게 다른거야??'

나름 직전학기 Database 과목 조교였던 나였지만 이 질문에 쉽게 대답을 하지 못하였다.

'그러게... key가 있고 없고의 차이인가??'

이 정도로 대답하고 속으로도 view는 어떤 기능을 하는 것일까 생각만하고 필요한 실험만 돌렸다.
그렇게 실험을 하던 중 view와 table의 차이를 발견하게 되었다.

view를 생성하기 위해 참조하였던 table에 새로운 데이터가 추가되거나 변경됨에 따라 view가 시시각각 변하는 것이었다.

아.. 비로소 감이 왔다. view를 생성할 때 사용되는 query문의 형식은 다음과 같다.

CREATE VIEW             WORKS_ON1

AS SELECT                 Fname, Lname, Pname, Hours

     FROM                   EMPLOYEE, PROJECT, WORKS_ON    

     WHERE                 Ssn=EssnAND Pno=Pnumber;

찾아보니.. 내가 강의한 자료에도 있다.


Efficient view implementation

-Query modification: present the view query in terms of a query on the underlying base tables

-View materialization: involves physically creating and keeping a temporary table

   maintaining correspondence between the base table and the view when the base table is updated: incremental update


여튼 간단한 걸 길게 써봤는데.... 이런식으로 체감하면서 느끼는 것은 절대 안 잊어버릴 거 같아서 길게 써봤다.


+ Recent posts