Python гэдэг нь#

Python нь энгийн уншихад амар, сурахад хурдан програмчлалын хэл. Шинжлэх ухааны салбаруудад, ялангуяа Machine Learning, Data Science-ийн салбарт Python-ны NumPy, SciPy зэрэг сангуудыг хослуулан ашигладаг. Олон тооны хүчтэй боловсруулалт, тоон тооцоолол хийдэг бэлэн үйлдэл бүхий library-тай. Deep Learning-ийн Framework ч гэсэн олон бий. Жишээлбэл Pytorch, TensorFlow гэх мэт.

Python — Ерөнхий#

Арифметик үйлдлүүд#

Нэмэх, хасах, үржих, хуваах, зэрэгт дэвшүүлэх үйлдлийг дараах байдлаар бичдэг.

2 - 4
# -2
2 * 7
# 14
10 / 4
# 2.5
5 ** 2
# 25

Хувьсагчийн төрлүүд#

整数 (integer / бүхэл тоо), 小数 (float / аравтын бутархай), 文字列 (string / тэмдэгт мөр) зэрэг төрөл бий. type() функцээр аливаа хувьсагчийн төрлийг шалгаж болдог.

type(67)
# <class 'int'>
type(3.1416)
# <class 'float'>
type("bye")
# <class 'str'>

Хувьсагч#

Python нь 動的型付き言語 динамик байдлаар төрлөө сольдог хэл. Динамик гэдэг нь хувьсагчийн төрөл автоматаар хувирч болдог гэсэн үг.

List, array, tuple#

| Feature | List | Array | Tuple | | ----------------- | ------------------------------------- | -------------------------------------- | ------------------------------------- | | Өөрчлөгдөх чанар | Өөрчлөгддөг (Mutable) | Өөрчлөгддөг (Mutable) | Өөрчлөгддөггүй (Immutable) | | Өгөгдлийн төрөл | Өөр өөр төрлийн өгөгдөл хадгалж болно | Ижил төрлийн элементүүдийг хадгална | Өөр өөр төрлийн өгөгдөл хадгалж болно | | Дараалалтай эсэх | Тийм | Тийм | Тийм | | Гүйцэтгэл | Тоон үйлдэлд удаан | Тоон үйлдэлд хурдан | List-ээс хурдан (өөрчлөгддөггүй тул) | | Санах ойн хэмнэлт | Бага үр ашигтай | Том хэмжээний өгөгдөлд илүү үр ашигтай | List-ээс илүү санах ой хэмнэдэг | | Хэрэглээ | Ерөнхий зориулалттай цуглуулга | Тоон болон нэг төрлийн өгөгдөлд | Тогтмол өгөгдөл, тогтмол утгуудад | | Синтакс | [ ] | array() | ( ) | | Индексжилт | Дэмжигдэнэ | Дэмжигдэнэ | Дэмжигдэнэ |

  • Mutable (өөрчлөгддөг) — объект үүсгэсний дараа түүний утга, агуулгыг өөрчлөх боломжтой. Жишээ нь: List-д элемент нэмэх, хасах, солих боломжтой.
  • Immutable (өөрчлөгддөггүй) — объект нэг удаа үүссэний дараа түүний утгыг өөрчлөх боломжгүй. Өөрчлөх шаардлагатай бол шинэ объект үүсгэх ёстой. Жишээ нь: Tuple үүсгэсний дараа элементийг нь солих, нэмэх, хасах боломжгүй.

Dictionary#

Индекс нь тэмдэгт байх түлхүүр утгын хос бүхий өгөгдлийн төрөл.

me = {'height':178} # Dictionary үүсгэх
print(me['height']) # элемент рүү хандах
# 178
me['weight'] = 59 # шинэ элемент нэмэх
print(me)
# {'height': 178, 'weight': 59}

Function#

Функц ингэж бичнэ.

def hello():
	print("Hello World!")
hello()
# Hello World

Танай тэмдэглэлд Inheritance болон Polymorphism-ийн жишээ код дутуу байна. Мөн бусад хэсгүүдийг жаахан баяжуулъя:

Python — Нэмэлт#

Python бол Обьект хандлагат хэл. Бүх зүйл нь объект байдаг. Өөрөөр хэлбэл, өмнө нь type() гэдэг функцээр төрлийг нь шалгахад тухайн объектын нэр болох class-ийг нь буцааж байсан гэсэн үг. Мэдээж өөрийн обьектыг үүсгэж, өөрт хэрэгтэй өгөгдлийн бүтцийг, түүн дээр ашиглагдах функцуудыг бичиж болно.

Class#

Обьект үүсгэхэд blueprint хэрэгтэй, тэр нь class. Class-аа дараах байдлаар бичнэ:

class ClassName:
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

    def method(self):
        # энд функцийн код бичигдэнэ
        pass

Object Oriented Programming#

Encapsulation:

Өгөгдлийг гаднаас шууд хандахаас хамгаалж, тусгай метод (getter/setter) ашиглан хяналттайгаар хандах боломж олгодог.

class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # private хувьсагч

    def get_balance(self):
        return self.__balance

    def deposit(self, amount):
        self.__balance += amount

acc = BankAccount(1000)
acc.deposit(500)
print(acc.get_balance())  # 1500
# print(acc.__balance)  # Алдаа! Шууд хандах боломжгүй

Abstraction:

Хэрэглэгчид зөвхөн юу хийхийг харуулж, дотоод нарийн ширийн хэрэгжилтийг нь нууж/далдалдаг.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return 3.14 * self.radius ** 2

c = Circle(5)
print(c.area())  # 78.5
# Хэрэглэгч зөвхөн .area() дуудна, дотор нь яаж бодогдож байгааг мэдэх шаардлагагүй

Inheritance:

Нэг класс нөгөө классын шинж чанар, метод зэргийг өвлөн авч, код давтахгүйгээр дахин ашиглах боломж олгодог.

class Animal:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f"{self.name} хооллож байна")

class Dog(Animal):  # Animal-аас өвлөж байна
    def bark(self):
        print(f"{self.name} хуцаж байна")

d = Dog("Бобик")
d.eat()   # Эцэг класснаас өвлөгдсөн метод
d.bark()  # Dog классын өөрийн шинэ метод

Polymorphism:

Ижил нэртэй метод классаас хамаарч өөр өөр байдлаар ажиллах чадвартай байдаг.

class Cat
    def sound(self):
        print("Мяу")

class Dog:
    def sound(self):
        print("Хав хав")

animals = [Cat(), Dog()]

for a in animals:
    a.sound()  # Ижил нэртэй метод дуудсан ч классаас хамааран өөр үр дүн гарна
# Мяу
# Хав хав

Numpy#

Deep Learning-д вектор, матриц дээр хийгдэх тооцоолол олон. Numpy сангийн numpy.array class-д ашиглахад амар method-ууд олон байдаг болохоор их ашигладаг. Бусад сан шиг л import numpy гээд дуудна.

Массив үүсгэх

numpy.array() methоd ашиглан Python-ий list-ээс NumPy-ийн массив (numpy.ndarray) үүсгэдэг.

x = np.array([1.0, 2.0, 3.0])
type(x)  # <class 'numpy.ndarray'>

Арифметик тооцоолол

Хоёр массивын элемент тоо ижил байх ёстой (жишээ нь хоёулаа 3 элементтэй бол). Ийм тохиолдолд тооцоолол нь element-wise (элемент тус бүрээр) хийгддэг: +, -, *, / бүгд харгалзах индекс дээрх элементүүдийг хооронд нь тооцоолно. Элементийн тоо зөрвөл алдаа гарна.

x = np.array([1.0, 2.0, 3.0])
y = np.array([3.0, 4.0, 6.0])
x + y # [4.0, 6.0, 9.0]
x - y # [-2.0, -2.0, -3.0]
----//----

Массивыг ганц тоо (scalar)-той тооцоолж болно — жишээ нь x / 2.0. Үүнийг broadcast гэдэг.

Олон хэмжээст массив

np.array([[1,2],[3,4]]) гэж бичвэл 2 хэмжээст массив (матриц) үүснэ.

  • .shape → хэлбэрийг (мөр, багана) харуулна
  • .dtype → элементийн өгөгдлийн төрлийг харуулна

Ижил хэлбэртэй матрицуудыг element-wise байдлаар нэмэх, үржих боломжтой. Матрицыг scalar-тай үржих (A * 10) нь мөн broadcast-ийн жишээ.

Ерөнхийлбэл:

  • 1 хэмжээст массив = вектор
  • 2 хэмжээст массив = матриц
  • 3+ хэмжээст = tensor / олон хэмжээст массив

Элементэд хандах (Indexing)

Индекс 0-ээс эхэлдэг.

Y = np.array([[1, 5], [4, 9], [6, 7]])
Y[0]      # array([1, 5]) — 0-р мөр
Y[0][1]   # 5 — (0,1) координаттай элемент

for давталтаар мөр бүрээр гүйлгэж болно.

for row in Y:
	print(row)
# [1, 5]
# [4, 9]
# [6, 7]

X.flatten() — олон хэмжээст массивыг 1 хэмжээст болгож хувиргана.

Y = Y.flatten()
print(Y)
# array([1, 5, 4, 9, 6, 7])
Y[np.array([0, 2, 4])]  # 0, 2, 4-р байрлалын элементүүдийг авна
# array([1, 4, 6])

Нөхцөлт сонголт (Boolean indexing):

Y > 5        # ижил хэлбэртэй Boolean массив буцаана (True/False)
Y[X > 5]     # зөвхөн 15-аас их утгуудыг шүүж авна

Matplotlib#

Deep Learning-ийн туршилтанд график зурах, өгөгдлийг харагдахуйц болгох (visualization) чухал үүрэгтэй. Matplotlib нь график зурах сан бөгөөд үүгээр график зурах, өгөгдлийг дүрслэж болдог.

График зурах

Графикийг matplotlib-ийн pyplot модулиар зурдаг.

import numpy as np
import matplotlib.pyplot as plt

# Өгөгдөл үүсгэх
x = np.arange(0, 6, 0.1)  # 0-ээс 6 хүртэл 0.1 алхамтайгаар үүсгэнэ
y = np.sin(x)

# Графикийг зурах
plt.plot(x, y)
plt.show()
  • np.arange()[0, 0.1, 0.2, ..., 5.8, 5.9] гэсэн өгөгдөл үүсгэнэ (энэ нь x)
  • np.sin()x-ийн элемент бүрт sin функц хэрэглэнэ (энэ нь y)
  • plt.plot(x, y) → графикийг зурна
  • plt.show() → графикийг дэлгэцэнд харуулна

pyplot-ийн бусад боломжууд

sin функц дээр нэмээд cos функцийг зурж, гарчиг болон тэнхлэгийн нэрийг нэмэх

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 6, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle="--", label="cos")  # тасархай шугамаар зурна
plt.xlabel("x")       # x тэнхлэгийн нэр
plt.ylabel("y")       # y тэнхлэгийн нэр
plt.title('sin & cos')  # гарчиг
plt.legend()
plt.show()

Ашигласан функцууд:

  • label= → тухайн шугамын нэрийг (легенд дээр гарна) заана
  • linestyle="--" → тасархай шугамаар зурна
  • xlabel(), ylabel() → тэнхлэгийн нэрийг заана
  • title() → графикийн гарчиг тавина
  • legend() → легенд (тайлбар хайрцаг)-ийг харуулна

Зураг харуулах

pyplot-ийн imshow() метод ашиглан зураг харуулж болно. Зургийг унших нь matplotlib.image модулийн imread()-ээр хийгддэг.

import matplotlib.pyplot as plt
from matplotlib.image import imread

img = imread(path_to_img)  # зургийг унших (замыг зөв тохируулах хэрэгтэй!)
plt.imshow(img)
plt.show()