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):
# энд функцийн код бичигдэнэ
passObject 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()