Simplifying complexity

int, float 같은 간단한 type은 비교적 손쉽게 계산할 수 있음 BUT 이런 값들이 많이 모여서 이루어진 값을 다루는 것은 쉽지 않음 e.g. list를 이용하여 행렬을 표현하고 곱셈을 계산하는 것

따라서 컴퓨터 이미지와 같은 복잡한 대상을 다루기 위해서는 특별한 방법이 필요함 마치 컴퓨터의 기본 type인것 처럼 다루도록..

abstraction in python

  • type is either primitive or user-defined
  • operators such as + or * computes new values
  • methods such as append() can either change the value or produce a new value
  • user-defined types can be associated with existing operators by defining specially named methods such as _add_

construction example

1
2
3
4
5
class Vector:
  def __init__(self,lst):
    self.vec = lst
x = Vector([1,2,3])
x

<_main_.Vector at 0x29ec1a5e7f0>

vector: lst라는 것을 넣는것으로 정의함

displaying value

1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = lst
    def __repr__(self):
        return "Vector"
x = Vector([1,2,3])
print(x)

Vector


1
2
3
4
5
class Vector:
  def __repr__(self):
    return "Vector({0})".format(self.vec)
x = Vector([1,2,3])
print(x)

Vector[1, 2, 3]


1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = lst
    def __repr__(self):
        return "Vector(" + str(self.vec) + ")"
x = Vector([1,2,3])
print(x)

Vector([1, 2, 3])

이제 완벽한건가…?

1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = lst
    def __repr__(self):
        return "Vector(" + str(self.vec) + ")"
x = Vector((1,2,3))
print(x)

Vector((1, 2, 3))

x에 tuple을 넣었더니 모양이 이렇게 나와버림..?

1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = lst
    def __repr__(self):
        return "Vector(" + str(self.vec) + ")"
x = Vector(range(10))
print(x)

Vector(range(0, 10))

range(10)을 넣었으면 Vector([0,1,2,3,4,5,6,7,8,9]) 나올줄 알았는데..? 뭐가 들어오든지 간에 list로 바꿔야함 self.vec에는 무조건 리스트만 들어갈 수 밖에 없도록 만들었더니 통일됨

1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = list(lst) #무조건 list로 형변환
    def __repr__(self):
        return "Vector(" + str(self.vec) + ")"
x = Vector(range(10))
print(x)

Vector([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


아규먼트{}와 format으로 더 깔끔하게 표현

{0} : 0번째 아규먼트 {1} : 1번째 아규먼트

1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({0})".format(self.vec)
x = Vector(range(10))
print(x)

Vector([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({0},{1})".format(self.vec,1)
x = Vector(range(10))
print(x)

Vector([0, 1, 2, 3, 4, 5, 6, 7, 8, 9],1)

1
2
3
4
5
6
7
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({1},{0})".format(self.vec,1)
x = Vector(range(10))
print(x)

Vector(1,[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


size of a vector

1
2
3
4
5
6
7
8
9
10
import math
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({})".format(self.vec)
    def size(self):
        return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
print(x.size())

1.4142135623730951


adding two vectors

자기자신은 self라는 이름을 주로 많이 사용하고 첫번째로 가고 다른애는 other라는 이름을 많이 씀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import math
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({})".format(self.vec)
    def __add__(self,other):
        x = self.vec
        y = other.vec
        return Vector([x[i] + y[i] for i in range(len(self.vec))])
    def size(self):
        return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
y = Vector([1,2])
print(x+y)

Vector([2, 3])


두 백터의 len이 다르면 더할 수 없음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import math
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({})".format(self.vec)
    def __add__(self,other):
        x = self.vec
        y = other.vec
        return Vector([x[i] + y[i] for i in range(len(self.vec))])
    def size(self):
        return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
y = Vector([1,2,3])
print(y+x)

IndexError: list index out of range


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({})".format(self.vec)
    def __add__(self,other):
        x = self.vec
        y = other.vec
        if len(x) != len(y):
            print("Error")
            return None
        return Vector([x[i] + y[i] for i in range(len(self.vec))])
    def size(self):
        return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1))
y = Vector([1,2,3])
print(y+x)

Error None


subtracting two vectors

빼기를 구현하자 (기본연산 구현되어 있찌 않으면 TypeError: unsupported operand type(s) for -: ‘Vector’ and ‘Vector’ 에러남

1
2
__sub__라는 특별한 이름의 메소드를 만들어보쟈
__add__에서 +를 -로 바꿈
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import math
class Vector:
    def __init__(self,lst):
        self.vec = list(lst)
    def __repr__(self):
        return "Vector({})".format(self.vec)
    def __add__(self,other):
        x = self.vec
        y = other.vec
        if len(x) != len(y):
            print("Error")
            return None
        return Vector([x[i] + y[i] for i in range(len(self.vec))])
    def __sub__(self,other):
        x = self.vec
        y = other.vec
        if len(x) != len(y):
            print("Error")
            return None
        return Vector([x[i] - y[i] for i in range(len(self.vec))])
    def size(self):
        return math.sqrt(sum([x**2 for x in self.vec]))
x = Vector((1,1,0))
y = Vector([1,2,3])
print(x-y)

Vector([0, -1, -3])


distance of two vectors

v1 = (1,0,4,4) v2 = (1,2,2,1)

v1v2 distance = sqrt((1-1)^2 + (2-0)^2 + (2-4)^2 + (1-4)^2)

문자 classification

문자 인식의 주요 원리는 숫자 주변에 네모칸을 치고 네개로 나눔, 각 칸을 1234 번호 붙이고 1사분면 안에 까만 점이 있는지 확인, 2사분면에 있는지 확인… 줄줄이 확인하고 (1,0,1,1) 같은식으로 표현하는 것임 또는 점이 몇개에 있는지 (2,0,1,3) 확인해서 그걸 기준으로 인식 칸을 더 마니 나누면 더 조밀한 기준이 세워지며 실수로 찍힌 점도 무시할 수 있게됨