[python] int8? float32? bool?, numpy 자료형 정리

컴퓨터비전/python|2020. 4. 2. 22:51

넘파이 패키지를 사용해서 파이썬 코딩을 하다보면 float32, float64, int8, int16, uint8, bool과 같은 것을 보게 됩니다. 오늘은 이것들이 무엇을 의미하는지 정리하도록 하겠습니다. 

 

우선 int는 정수형, uint는 부호가 없는 정수형, float는 부동소수형을 의미합니다. 그리고 뒤에 붙는 숫자는 값을 저장하는데 사용되는 비트수를 의미합니다. 클수록 더 큰 범위의 숫자를 담을 수 있습니다. 다루는 숫자의 크기를 고려해서 적절한 자료형을 선택해주면 됩니다. 

 

정수형 자료형

int8 => 1비트당 2개의 숫자를 표현할 수 있으므로 8비트면 2^8 = 256개의 정수를 표현할 수 있습니다. 즉 -128에서 127까지 표현가능합니다.

int16 => 2^16개의 정수표현 가능. -32,768에서 32,767까지.

int32 => 2^32개의 정수표현 가능. -2,147,483,648에서 2,147,483,647까지. 

int64 => 2^64개의 정수표현 가능. -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807까지

 

부호없는 정수형 자료형

uint8 => 2^8개의 부호없는 정수표현 가능. 0에서 255까지. 그레이스케일 또는 3채널 컬러 이미지를 담을 때 많이 사용됩니다. 

uint16 => 2^16개의 부호없는 정수표현 가능. 0에서 65,535까지. 

uint32 => 2^32개의 부호없는 정수표현 가능. 0에서 4,294,967,295까지.

uint64 => 2^64개의 부호없는 정수표현 가능. 0에서 18,446,744,073,709,551,615까지.

 

부동소수형(실수형) 자료형

float16 => 1비트는 부호에, 5비트는 정수부분을 나타내는데, 10비트는 소수부분을 나타내는데 사용됩니다. 이에 대한 자세한 내용은 https://en.wikipedia.org/wiki/Single-precision_floating-point_format를 참고해주세요.^^

float32 => 1비트 부호, 8비트 정수, 23비트 소수.

float64 => 1비트 부호, 11비트 정수, 52비트 소수. 

 

논리형 자료형

bool => 참(True)과 거짓(False)을 표현하기 위한 자료형입니다. 

 

자료형 선정의 중요성

적절한 자료형을 선택해주는 것이 왜 중요한가에 대한 예제를 하나 다루도록 하겠습니다. 위에서 보신 것처럼 uint8은 0-255의 정수를 표현할 수 있는 자료형입니다. 만약에 uint8형 변수에 300을 넣어준다면 어떻게 될까요? 아래 예제를 함께 보시죠. 

 

코드>>

 

실행결과>>

 

200은 문제없이 uint8이 표현해낼 수 있지만, 300은 감당할 수가 없습니다. 엉뚱한 숫자인 44가 b에 할당된 것을 보실 수 있습니다. 따라서 자료형 선정은 항상 신경을 써야하는 부분입니다. 잘못하면 의미있는 숫자들을 날려버릴 수도 있고, 아니면 완전 엉뚱한 결과가 할당되어 있을 수도 있기 때문입니다. 오늘은 여기까지..

 

 

<참고자료>

[1] https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html, SciPy.org, "Data types"

댓글()

[python] 클래스(class)와 객체(object)

컴퓨터비전/python|2020. 4. 2. 10:36

클래스는 틀, 객체는 틀로 찍어낸 결과물로 볼 수 있습니다. 붕어빵 틀을 가지고는 붕어빵을 만들어낼 수 있고, 호두과자 틀로는 호두과자를 만들어낼 수 있듯이, 우리는 클래스로 객체를 찍어낼 수 있습니다. 클래스라는 틀만 만들어놓으면 말이죠. 또한 붕어빵 틀을 가지고 팥붕어빵, 크림붕어빵, 김치붕어빵 등을 만들어낼 수 있듯이, 클래스를 이용해서 모양은 같지만 내용은 다른 객체들을 찍어낼 수 있습니다.  

 

저는 사람이라는 클래스와 포켓몬이라는 클래스를 만든 후에 몇 명의 사람과 몇 마리의 포켓몬을 찍어내는 코드를 작성해봤습니다. 사람 클래스에는 자기소개 함수와 포켓몬 수집 함수를 포함시켜놨고, 포켓몬 클래스에는 자기소개 함수와 공격 함수를 포함시켜놨습니다. 

 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Person:
    def __init__(self, name):
        self.name = name
        
    def introduce(self):
        print("안녕! 나는 " + self.name + "야.")
    
    def catch(self, pokemon_name):
        print(pokemon_name + ", 넌 내거야~!\n")
 
class Pokemon:
    def __init__(self, name):
        self.name = name
        
    def introduce(self):
        print("얍! 나는 " + self.name + "!")
        
    def attack(self, pokemon_name):
        print(pokemon_name + ", 내 공격을 받아랏!\n")
    
 
p1 = Person("지우"# 객체 찍어내기
p2 = Person("이슬"# 객체 찍어내기
p3 = Person("웅"# 객체 찍어내기
 
p1.introduce()
p1.catch("피카츄")
 
p2.introduce()
p2.catch("고라파덕")
 
p3.introduce()
p3.catch("마자용")
 
m1 = Pokemon("이상해씨"# 객체 찍어내기
m2 = Pokemon("리자몽"# 객체 찍어내기
m3 = Pokemon("모래두지"# 객체 찍어내기
 
m1.introduce()
m1.attack("또또가스")
 
m2.introduce()
m2.attack("야도란")
 
m3.introduce()
m3.attack("나옹")
cs

 

실행결과 다음과 같은 내용이 출력되었습니다. 

 

 

클래스라는 틀에 의해 세 명의 사람과 세 마리의 포켓몬이 잘 찍어내졌음을 확인하실 수 있을 것입니다. 

댓글()

[python] 좋아하는 스포츠 종목 설문조사하고 바로 통계내기

컴퓨터비전/python|2020. 4. 2. 02:24

제가 즐겨보는 유튜브 채널, "코딩하는 테크보이 워니"님의 영상을 보다가, 파이썬의 자료구조인 딕셔너리(dictionary)와 리스트(list)를 이용한 예제가 흥미로워서 그것을 응용해서 다음과 같은 코드를 작성해봤습니다. 설문조사 대상자들에게 좋아하는 스포츠 종목이 무엇인지 물어본 후 통계내는 코드입니다. 

 

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
26
27
28
sports = []
 
= 1
while True:
    print("\n<%d번째 대상자>" % i)
    x = [input("어떤 스포츠 좋아하세요?(q 누르면 반복문 탈출): ")]
    if x == ['q']:
        break
    
    sports = sports + x
    i = i + 1
 
summary = {}
 
for s in sports:
    if s in summary:
        summary[s] = summary[s] + 1
    else:
        summary[s] = 1
        
print(summary)
 
 
total_num = sum(summary.values())
for key in summary:
    summary[key] = summary[key]/total_num
 
print(summary)
cs

 

이 코드를 실행하면 여러 사람들이 본인이 좋아하는 스포츠 종목을 입력하고 최종적으로 그것이 정리됩니다. 어떤 종목을 몇 명의 사람이 좋아하는지 알 수 있습니다. 또한 각각 몇 %에 해당하는지를 알려줍니다. 

 

 

총 19명 중에 9명이 축구를 좋아한다고 했구요(물론 제가 마음대로 입력했지만요^^;), 그 수는 약 전체의 47%에 해당합니다. 야구의 경우 4명이 좋아하고, 전체의 약 21%에 해당하는 수치입니다. 

 

이런 식으로 파이썬을 이용해서 간단한 설문조사도 할 수 있겠죠?ㅎㅎ 

댓글()

[python] 반복문: for문, while문 그리고 break, continue

컴퓨터비전/python|2020. 4. 2. 00:33

똑같은 것을 기계적으로 반복하는 것만큼 싫은 것도 없습니다. 이런건 기계에게 시켜야죠. 그래서 필요한 것이 바로 반복문입니다. 반복문에는 크게 for문과 while문이 있습니다. hello를 5번 출력시키고 싶다면, 다음과 같이 코딩하면 됩니다. 

 

1. for문

코드>>

실행결과>>

 

2. while문

코드>>

 

while 문의 경우에는 조건이 충족되는 한 반복합니다. i가 처음에 0이므로 0 < 5라는 조건을 충족시키기 때문에 while문 내부가 실행됩니다. 그리고 i = i + 1을 만나면서 i = 1이 되고, 1 < 5는 참이기 때문에 또다시 while문 내부가 실행됩니다. 이렇게 쭉 반복되다가 i = 5가 되면, 5 < 5는 거짓이므로 더이상 반복하지 않습니다. 즉, i가 0, 1, 2, 3, 4일 때 print("hello")가 실행되므로 총 5번 hello를 출력하게 됩니다. 

 

실행결과>> 

 

3. break

반복문에서 탈출해야하는 경우들이 있습니다. 특히 무한루프를 걸어뒀을때 말이죠. 이때는 break를 사용하면 됩니다. 

 

코드>>

while의 조건을 True로 해서 무한루프(무한으로 반복됨)가 되게 했고, i가 3이 되면 반복문을 탈출하도록 코딩했습니다.

 

 

실행결과>>

 

4. continue

반복문 내에서 continue를 만나면 그 아래는 더이상 실행시키지 않고 반복문 처음으로 돌아갑니다. 바로 이렇게 말이죠. 

 

코드>>

 

i가 3일때는 print("i가 3이 아니라서..")가 실행되지 않습니다. 

 

실행결과>>

 

 

i가 3일 때는 "i가 3이 아니라서.."라는 문구가 출력되지 않은 것을 확인할 수 있습니다. 이런 기능을 어떨때 쓰냐 물으시는 분들도 있겠지만, continue 생각보다 유용하게 사용됩니다.ㅎㅎ 

댓글()

[python] 조건문 if, elif, else

컴퓨터비전/python|2020. 4. 1. 23:45

변수, 조건문, 반복문, 함수는 코딩에 있어서 매우 중요한 친구들입니다. 이것들만 알아도 웬만한 건 다 코딩해낼 수 있다고 보셔도 됩니다. 이 중에서 오늘 다루는 조건문은 논리 구조를 만들어내기 때문에 특히 중요합니다. 파이썬에서는 if, elif, else를 이용해서 조건문을 나타냅니다. 여기서 elif는 else if를 나타냅니다. 그러면 간단한 예제를 통해서 조건문을 어떻게 만들어내는지 살펴보도록 하겠습니다. 

 

1. 입력받은 숫자가 5보다 크면 5보다 크다고 출력해주기(if만 활용)

코드>>

 

실행결과>>

10을 입력했더니 10는 5보다 큽니다. 라는 문구가 떴습니다. 

 

4를 입력했더니 아무런 반응이 없습니다. 조건이 맞지 않아 그냥 지나간 것이죠. 

 

2. 입력받은 숫자가 5보다 크면 5보다 크다고, 5보다 작거나 같으면 5보다 작거나 같다고 출력해주기(if와 else 활용)

코드>>

 

실행결과>>

8을 입력했을 때,

 

3을 입력했을 때,

 

3. 입력받은 숫자가 5보다 크면 5보다 크다고, 5보다 작으면 작다고, 5랑 같으면 같다고 출력해주기(if와 elif와 else 활용)

코드>>

 

실행결과>>

9를 입력했더니,

 

1을 입력했더니,

 

5를 입력했더니,

 

마지막으로 방금 예제를 동양적인 예제로 탈바꿈해보겠습니다.ㅎㅎ 

 

코드>>

 

실행결과>>

35를 입력했을 때,

 

30을 입력했을 때,

 

33을 입력했을 때,

 

조건문 그렇게 어렵지 않죠? ㅎㅎ 참고로 더 많은 elif를 사용할 수도 있습니다. 필요에 맞게 문법에 맞게 코딩해주시면 됩니다. 

댓글()