2013년 7월 31일 수요일

Numpy 함수를 Array 적용하기

파이썬에서는 기본적으로 map 이라든지.

list comprehension의 방법으로 함수를 list나 dictionary에 적용이 가능하다.


기존의 map함수를 이용해서도 모든 array에 적용이 가능하지만,

반환되는 형태가 array가 아니라 python list형태로 반환이 되므로

다시 , array형태로 변경이 필요하게 된다.


그래서 , numpy에서는 array가 기본데이터 형태이므로 바로 array에 적용하는 방법이 필요하게 된다.

그 역할을 하는 함수가 vectorize이다.

import numpy as np

Arr = np.ndarray((3,4))
def foo(x):
    return x * x 

foo = np.vectorize(foo)  # 함수를 적용.  array에 적용가능하도록 변경. 

result = foo(Arr)  # Arr는 array의 이름임. 

2013년 7월 30일 화요일

Numpy array 형변환 하는 방법

Array를 통째로 형을 바꾸고 싶을때,

astype 명령어를 사용하면 됩니다.


>>> x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
>>> type(x)

>>> x.shape
(2, 3)
>>> x.dtype
dtype('int32')

>>> x = x.astype('uint8')
>>> x.dtype
dtype('uint8')


ps. dtype 명령어는 이것의 형을 확인할 수 있는 명령어입니다.

2013년 7월 27일 토요일

파이썬 람다(lambda) 함수

lambda 함수는 무엇일까요.. 

람다 함수는 람다 대수학(lambda calculus)에서 유래된 이름입니다만,
대부분의 사람들은 lambda란 용어가 사실 익숙치가 않습니다.  간단하게
이해하기 쉬운용어로 이것을 바꾸면 익명함수라고합니다.

lambda 함수는 아래와 같은 형태를 지닙니다. 쉽게 생각하면 one line function 이라고 보면됩니다. 아래 expression이 실제 함수 부분이라고 보면 되고요,



즉, 이름이 없는 함수인데요, 그럼 . 이름이 없는 함수를 왜쓰느냐..
단순하게 생각해서는 그냥 일회용으로 쓰는 용도로 씁니다.

그냥 쓰고 버리는 형태로요,

그냥 함수를 쓰고 싶은데 이름을 안정해주고 그냥 inline으로 씁니다.

그러면, 가장 기본적으로 coding량이 줄어드는 효과가 있고,

또, 생각의 흐름을 방해하지 않게 됩니다.

사람의 생각이 물흐르듯이 흐르게 됩니다.

보통 A -> B -> C 이렇게 주욱가는경우에

중간에 B에서 함수를 호출하면,

c 같은 경우에는,
A -> B -> function k -> B -> C 이런식으로

중간에 사고의 흐름이 끊어지게 되는 형태가 나오는데요
이게 중간에 다른데를 읽고 다시오게 때문에 좀 읽기에 방해가 되는 경우가 있습니다,

그런 경우에 짧은 함수들은 그냥 lambda로 선언해서 생각을 방해하지 않고, 물흐르듯이 진행할수가 있습니다.





a = lambda x , y : x * y 
print a(3,4) 
>> 12

이런식의 결과를 얻게 됩니다.

마찬가지로 sorting 같은 경우에도 보통 key function을 정해주는데,

이것도 lambda 로 선언해서, 기본적으로 제공해주는 sorting algorithm이 돌아갈 수 있도록,
해줍니다.

제곱수가 가장 작은 순서대로 소팅을 하고 싶다.

a = [ -1, -8, 3, -4, 2, 5, -7]
a.sorted(key=lambda x : x*x,reverse=False) 
>> print a
[-1,2,3,-4,5,-7,8]

아마도 이렇게 되겠지요?

p.s. 지적해주신 부분 수정하였습니다.

2013년 7월 20일 토요일

파이썬 class에서 함수 이름으로 호출하기


생각보다 간단한 방법이 있음.

getattr을 이용하면됨.

class ABC(object):
  def __init__(self):
    pass
  def foo(self):
    print 'foo'
  def bar(self):
    print 'bar'

a = ABC()

>> getattr(a,'foo')
foo
>> getattr(a,'bar')
bar


2013년 7월 8일 월요일

numpy array [::] 사용법

numpy 에서 array를 다루는 것은 for문을 생각하면 쉽습니다. A[start:end:step] 이런식으로 표현이 됩니다. 아래는 2차 matrix에 대해서, 원하는 데이터만 뽑아 올때 아래와 같이 합니다.

import numpy as np

k =  [[11,24,53,12,22,11],
[14,38,43,22,32,31],
[18,21,63,18,22,41],
[12,23,56,12,24,41],
[14,22,57,12,21,31],]

a = np.array(k)

print a[:]
[[11 24 53 12 22 11]
 [14 38 43 22 32 31]
 [18 21 63 18 22 41]
 [12 23 56 12 24 41]
 [14 22 57 12 21 31]]


print [::2]

[[11 24 53 12 22 11]
 [18 21 63 18 22 41]
 [14 22 57 12 21 31]]

print [:3:]
[[11 24 53 12 22 11]
 [14 38 43 22 32 31]
 [18 21 63 18 22 41]]
 
print [2:5:2]
[[18 21 63 18 22 41]
 [14 22 57 12 21 31]]
            
여기서 부터는 2차원으로 확장해 봅니다.


print [::2]
[[11 24 53 12 22 11]
 [18 21 63 18 22 41]
 [14 22 57 12 21 31]]
행(row)만 뽑아옵니다. 

print [:,::2]
[[11 53 22]
 [14 43 32]
 [18 63 22]
 [12 56 24]
 [14 57 21]]
열(column)만 뽑아봅니다. 


print [::2,1:3:]

[[24 53]
 [21 63]
 [22 57]]  

열과 행을 동시에 적용시킵니다. 

위와 같은 방법으로 간단히 for 문으로 하는 방법들을 제어할수 있습니다. 물론 이것은 numpy로 하는 방법입니다. 일반 python에서는 안먹습니다. numpy는 기존 matlab을 구현한 것이기에 matlab과 문법이 상당히 유사합니다. 그래서 numpy를 익히실때는 matlab책을 놓고 같이 보시면 상당히 유용할때가 많습니다.