728x90
반응형

파이썬의 기본문법 (1) 에 이어 두번째 포스팅이다.



1. 클래스 


개발자가 새로운 클래스를 정의할 수도 있다. 즉, 독자적인 자료형을 정의할 수 있다.

또한, 클래스에는 그 클래스만의 전용함수와 속성을 정의 할 수 있다.




class 클래스 이름 :

def __init__ (self, 인수, ....) :           #생성자

    ....

def 메소드 이름 1 (self, 인수, ...) :     # 메소드 1

    ....

def 메소드 이름 2 (self, 인수, ...) :     # 메소드 2

    ....



init 메소드는 클래스를 초기화 하는 방법을 정의한다.

초기화용 메소드를 '생성자'라고 한다.

클래스의 인스턴스가 만들어질 때 한 번만 불린다.

그리고 메소드의 첫번째 인수로 self 를 쓴다. 

자신의 인스턴스를 나타내는 self 를 명시적으로 쓴다.



클래스 생성 예시


class Girl :

def __init__ (self, name) :

self.name = name

print("Initialized!")


def hello(self)

print("Hello" + self.name + "!")


def goodbye(self)

print("Good-bye" + self.name + "!")


m = Man("David")

m.hello()

m.goodbye()



다음과 같은 파이썬 스크립트 파일을 콘솔창에서 다음과 같이 실행하면 결과가 나온다.


$ python Girl.py

Initialized!

Hello David!

Good-bye David!





2. 넘파이


영상처리 기능들을 구현하다보면 배열 이나 행렬 계산이 많이 등장한다.

이는 딥러닝에서도 등장한다. 배열이나 행렬 처리를 수월하게 하기 위해서 등장한게 

넘파이 이다.


넘파이의 배열 클래스인 numpy.array 에는 편리한 메소드가 많이 내장되어있다.



2.1. 넘파이 가져오기


넘파이는 외부 라이브러리 이기 때문에 Import 해주어야 한다.


>>> import numpy as np


이 문장은 np라는 이름으로 넘파이를 불러온 것이다.

앞으로 np 라는 이름을 통하여 넘파이에 내장되어있는 함수를 쓰면 된다.



2.2 넘파이 배열 생성


넘파이를 이용한 배열생성은 np.array() 함수를 사용한다. 

이는 파이썬의 리스트를 인수로 받아와 넘파이 라이브러리가 제공하는 특수한 형태의 배열(numpy.ndarray)를 반환한다.


>>> x = np.array([1.0, 2.0, 3.0])

>>> print(x)

[1. 2. 3.]


>>> type(x)

<class 'numpy.ndarray'>



2.3 넘파이의 산술 연산


각 원소별(element-wise) 덧셈, 뺄셈, 나눗셈, 곱셈을 수행 할 수 있다.

그러나 원소 수가 같을 때 행해지고, 원소 수가 서로 다르다면 오류가 발생한다.

>>> x = np.array([1.0, 2.0, 3.0])

>>> y = np.array([2.0, 4.0, 6.0])

>>> x + y

array ([3., 6., 9.])


>>> x - y

array ([-1., -2., -3.])


...

넘파이 배열은 원소별 계산 뿐만아니라 넘파이 배열과 수치하나(스칼라 값)의 조합으로 된 산수 ㄹ연산도 수행할 수 있다.

이 경우 스칼라 값과의 계산이 넘파이 배열의 원소별로 한번씩 수행된다.

이를 브로드 캐스트라고 한다. 




2.4 넘파이의 N차원 배열


넘파이는 1차원 배열 뿐만아니라 다차원 배열도 작성할 수 있다.

2차원 배열은 다음과 같이 작성한다.


>>> A = np.array([1, 2], [3, 4])

>>> print (A)

[[1 2]

 [3 4]]


>>> A.shape

(2, 2)


>>> A.dtype

dtype('int64')


>>> B = np.array([3, 0], [0, 6])

>>> A + B

array([[4, 2], 

   [3, 10]])

>>> A * B

array([[3, 0],

        [0, 24]])


형상이 같은 행렬끼리면 행렬의 산술 연산도 대응하는 원소별로 계산된다.

배열도 마찬가지다.

행렬과 스칼라 값의 산술 연산도 가능하다.


>>> A * 10

array([[10, 20],

        [30, 40]])


여기서 굉장히 C++ 과는 다르게 훨씬 쉽게 배열 계산을 한다는 점에 주목할 필요가 있다.

예전엔 이중 for문을 통해 2차원 배열 값을 관리했었는데... A + B 만 하면 된다니...


참고로 넘파이 배열ㄹ은 N차원 배열을 작성할 수 있다.

수학에서 1차원 배열은 벡터

2차원 배열은 행렬

벡터와 행렬을 일반화한 것을 텐서(tensor)라고 한다.






2.5 브로드 캐스트


넘파이에서는 형상이 다른 배열끼리도 계산이 가능하다.

앞에서 10이라는 스칼라 값을 행렬에 곱했을때 행렬의 원소마다 10이 곱해졌다.

이러한 똑똑한 기능을 브로드 캐스트라고 일컫는다.


즉, 스칼라 값인 10이 2x2 행렬로 확대되어 계산되는 것이다.


그래서 형상이 다른 배열끼리의 연산이 가능한 것이다.




2.6 원소 접근


원소의 인덱스는 0부터 시작한다.

각 원소에 접근하려면 다음과 같이 쓴다.


>>> X = np.array([[51, 55], [14, 19], [0, 4]])

>>> print(x)

[[51 55]

 [14 19]

 [0    4]]


>>> X[0]        # 0행

array([51, 55])

>>> X[0][1]    # (0, 1) 위치의 원소

55


for 문을 통해서 각 원소에 접근 할 수도 있다.


>>> for row in X :

...    print(row)

...

[51 55]

[14 19]

[0    4]


넘파이는 지금까지의 방법 외에도, 인덱스를 배열로 지정해 한 번에 여러 원소에 접근할 수도 있다.


>>> X = X.flatten()            # X를 1차원 배열로 변환 ( 평탄화 )

>>> print(X)

[51 55 14 19 0 4]

>>> X[np.array([0, 2, 4])]    #인덱스가 0, 2 ,4 인 원소 얻기

array([51, 14, 0])


이 기법을 이용하면 특정 조건을 만족하는 원소만 얻을 수 있다. 


>>> X > 15

array([True, True, False, True, False, False], dtype=bool)

>>> X[X>15]

array([51, 55, 19])


넘파이 배열에 부등호 연산자를 사용한 결과는 bool 배열이다.

여기에서 bool 배열을 사용해 배열 X에서 True 에 해당하는 원소, 즉 값이 15 보다 큰 원소만 꺼내고 있다. 



* 파이썬 같은 동적언어에서는 C나 C++ 같은 정적언어(컴파일 언어)보다 처리 속도가 늦다고 한다. 실제로 무거운 작업을 할 때는 C/C++로 작성한 프로그램을 쓰는 편이 좋고, 파이썬에서 빠른 성능이 요구될 경우 해당 부분을 C/C++로 구현하곤 한다. 그때 파이썬은 C/C++ 로 쓰인 프로그램을 호출해주는 중개자 역할을 하게 된다. 넘파이도 주된 처리는 C와 C++로 구현되어있다고 한다. 그래서 성능을 해치지 않으면서 파이썬의 편리한 문법을 사용할 수 있다. 


- 아 그래서 배열을 저렇게 처리 할 수 있는 것이구나....






728x90
반응형