3-bo‘lim
NumPy - massivlar bilan ishlash
ndarray yaratish, indekslash, vektorlashtirilgan amallar, broadcasting va statistik funksiyalar.
Ushbu bo‘lim mundarijasi
NumPy - Python dagi barcha ilmiy hisoblashlarning poydevori. Pandas, scikit-learn va TensorFlow - hammasi uning ustiga qurilgan.
Nima uchun NumPy? #
import numpy as np
import time
# Oddiy Python ro'yxati
royxat = list(range(1_000_000))
boshlandi = time.perf_counter()
natija = [x * 2 for x in royxat]
print(f"Ro'yxat: {time.perf_counter() - boshlandi:.4f} soniya")
# NumPy massivi
massiv = np.arange(1_000_000)
boshlandi = time.perf_counter()
natija = massiv * 2
print(f"NumPy: {time.perf_counter() - boshlandi:.4f} soniya")
Ro'yxat: 0.0682 soniya
NumPy: 0.0021 soniya
30 barobar tezroq.
| Python ro'yxati | NumPy massivi | |
|---|---|---|
| Xotirada | Ko'rsatkichlar to'plami | Uzluksiz blok |
| Turlar | Har xil bo'lishi mumkin | Bir xil |
| Amallar | Python tsikli | C tilida bajariladi |
NumPy ma'lumotni xotirada ketma-ket saqlaydi va amallarni kompilyatsiya qilingan C kodida bajaradi.
Massiv yaratish #
import numpy as np
# Ro'yxatdan
sonlar = np.array([1, 2, 3, 4, 5])
print(sonlar)
[1 2 3 4 5]
# Ikki o'lchovli
jadval = np.array([
[65, 2, 620],
[90, 3, 780],
[120, 4, 1150],
])
print(jadval)
print("Shakl:", jadval.shape)
[[ 65 2 620]
[ 90 3 780]
[ 120 4 1150]]
Shakl: (3, 3)
nollar = np.zeros((2, 3)) # nollar bilan
birlar = np.ones((3, 2)) # birlar bilan
toldirgan = np.full((2, 2), 7) # ma'lum qiymat bilan
birlik = np.eye(3) # birlik matritsa
oraliq = np.arange(0, 10, 2) # 0 dan 10 gacha, qadam 2
tekis = np.linspace(0, 1, 5) # 0 dan 1 gacha 5 ta nuqta
print(oraliq)
print(tekis)
[0 2 4 6 8]
[0. 0.25 0.5 0.75 1. ]
Tasodifiy sonlar #
np.random.seed(42) # takrorlanuvchanlik uchun
tasodifiy = np.random.rand(3, 2) # [0, 1) oralig'ida
normal = np.random.randn(1000) # normal taqsimot
butun = np.random.randint(1, 100, 5)
tanlangan = np.random.choice([10, 20, 30], size=4)
print(butun)
print(tanlangan)
[52 93 15 72 61]
[30 10 20 20]
seed ni har doim o'rnatingnp.random.seed(42) bir xil "tasodifiy" sonlarni kafolatlaydi.
Bu tajribalarni takrorlash uchun juda muhim: siz va hamkasbingiz bir xil natija olasiz.
42 raqami - dasturchilar orasidagi an'ana, istalgan son bo'lishi mumkin.
Massiv xossalari #
massiv = np.array([[1, 2, 3], [4, 5, 6]])
print("Shakl: ", massiv.shape) # (2, 3)
print("O'lchamlar: ", massiv.ndim) # 2
print("Elementlar: ", massiv.size) # 6
print("Turi: ", massiv.dtype) # int64
print("Bayt: ", massiv.nbytes) # 48
# Turni o'zgartirish
kasr = massiv.astype(float)
print(kasr.dtype)
float64
butunlar = np.array([1, 2, 3])
butunlar[0] = 2.7
print(butunlar)
[2 2 3]
2.7 kesib tashlandi! Massiv turi int64 bo'lgani uchun.
Kasr kerak bo'lsa, avvaldan e'lon qiling:
sonlar = np.array([1, 2, 3], dtype=float)
Indekslash va kesish #
sonlar = np.array([10, 20, 30, 40, 50, 60])
print(sonlar[0]) # 10
print(sonlar[-1]) # 60
print(sonlar[1:4]) # [20 30 40]
print(sonlar[:3]) # [10 20 30]
print(sonlar[::2]) # [10 30 50]
print(sonlar[::-1]) # [60 50 40 30 20 10]
jadval = np.array([
[65, 2, 620],
[90, 3, 780],
[120, 4, 1150],
])
print(jadval[0, 2]) # 620 - birinchi qator, uchinchi ustun
print(jadval[1]) # [ 90 3 780] - butun qator
print(jadval[:, 0]) # [ 65 90 120] - birinchi ustun
print(jadval[:2, :2]) # birinchi ikki qator va ustun
620
[ 90 3 780]
[ 65 90 120]
[[65 2]
[90 3]]
asl = np.array([1, 2, 3, 4, 5])
qism = asl[1:4]
qism[0] = 999
print(asl)
[ 1 999 3 4 5]
NumPy da kesish ko'rinish (view) qaytaradi, nusxa emas. Asl massiv ham o'zgardi!
Nusxa kerak bo'lsa:
qism = asl[1:4].copy()
Shartli tanlash #
Bu ML da eng ko'p ishlatiladigan imkoniyat.
narxlar = np.array([620, 780, 1150, 380, 950])
print(narxlar > 700)
print(narxlar[narxlar > 700])
[False True True False True]
[ 780 1150 950]
# Bir nechta shart
qimmat_emas = narxlar[(narxlar > 500) & (narxlar < 1000)]
print(qimmat_emas)
# Shartga ko'ra almashtirish
belgilangan = np.where(narxlar > 800, "qimmat", "arzon")
print(belgilangan)
[620 780 950]
['arzon' 'arzon' 'qimmat' 'arzon' 'qimmat']
and emas, &# XATO
narxlar[(narxlar > 500) and (narxlar < 1000)] # ValueError
# TO'G'RI
narxlar[(narxlar > 500) & (narxlar < 1000)]
NumPy da mantiqiy amallar: & (va), | (yoki), ~ (emas).
Qavslarni unutmang - ular majburiy.
Vektorlashtirilgan amallar #
sonlar = np.array([1, 2, 3, 4])
print(sonlar + 10) # [11 12 13 14]
print(sonlar * 2) # [2 4 6 8]
print(sonlar ** 2) # [ 1 4 9 16]
print(np.sqrt(sonlar)) # [1. 1.41 1.73 2. ]
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(a + b) # [11 22 33]
print(a * b) # [10 40 90]
print(np.dot(a, b)) # 140 - skalyar ko'paytma
# YOMON - sekin
natija = []
for son in sonlar:
natija.append(son * 2 + 1)
# YAXSHI - tez va qisqa
natija = sonlar * 2 + 1
NumPy bilan ishlaganda tsikl yozayotgan bo'lsangiz - deyarli har doim uni vektorlashtirilgan amal bilan almashtirish mumkin.
Broadcasting #
Turli shakldagi massivlar ustida amal bajarish.
matritsa = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
vektor = np.array([10, 20, 30])
print(matritsa + vektor)
[[11 22 33]
[14 25 36]
[17 28 39]]
Ikki massiv mos kelishi uchun, o'ngdan chapga qarab har bir o'lcham:
- teng bo'lishi, yoki
- biri 1 ga teng bo'lishi kerak
(3, 3) va (3,) → mos (3,) ni (1, 3) deb qaraladi
(3, 3) va (3, 1) → mos ustun sifatida cho'ziladi
(3, 3) va (2,) → mos emas
Shaklni o'zgartirish #
sonlar = np.arange(12)
print(sonlar.reshape(3, 4))
print(sonlar.reshape(4, -1)) # -1: qolganini o'zi hisoblasin
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
matritsa = np.array([[1, 2], [3, 4]])
print(matritsa.T) # transpozitsiya
print(matritsa.flatten()) # bir o'lchovga
print(matritsa.ravel()) # bir o'lchovga (ko'rinish)
reshape(-1, 1) - ML da eng ko'p uchraydiganscikit-learn X uchun ikki o'lchovli massivni kutadi:
maydon = np.array([65, 90, 120]) # shakl: (3,)
X = maydon.reshape(-1, 1) # shakl: (3, 1)
"Expected 2D array, got 1D array instead" xatosini ko'rsangiz - javob shu.
Statistik funksiyalar #
narxlar = np.array([620, 780, 1150, 380, 950, 700])
print("Yig'indi: ", narxlar.sum())
print("O'rtacha: ", narxlar.mean())
print("Mediana: ", np.median(narxlar))
print("Standart og'ish:", narxlar.std().round(2))
print("Eng kichik: ", narxlar.min())
print("Eng katta: ", narxlar.max())
print("Eng katta indeks:", narxlar.argmax())
Yig'indi: 4580
O'rtacha: 763.33
Mediana: 740.0
Standart og'ish: 246.42
Eng kichik: 380
Eng katta: 1150
Eng katta indeks: 2
O'q bo'yicha amallar #
jadval = np.array([
[65, 2, 620],
[90, 3, 780],
[120, 4, 1150],
])
print("Ustunlar bo'yicha:", jadval.mean(axis=0))
print("Qatorlar bo'yicha:", jadval.mean(axis=1))
Ustunlar bo'yicha: [ 91.67 3. 850. ]
Qatorlar bo'yicha: [229. 291. 424.67]
axis ni eslab qolishaxis=0- qatorlar bo'ylab pastga harakat, natija har bir ustun uchunaxis=1- ustunlar bo'ylab o'ngga harakat, natija har bir qator uchun
Oddiy qoida: axis - yo'q qilinadigan o'lcham.
(3, 3) massivda axis=0 bo'lsa, natija (3,) bo'ladi.
Normalizatsiya - amaliy misol #
ML da ma'lumotni bir xil masshtabga keltirish juda muhim:
belgilar = np.array([
[65, 2, 620],
[90, 3, 780],
[120, 4, 1150],
[45, 1, 380],
])
# Min-max normalizatsiya: [0, 1] oralig'iga
eng_kichik = belgilar.min(axis=0)
eng_katta = belgilar.max(axis=0)
normal = (belgilar - eng_kichik) / (eng_katta - eng_kichik)
print(normal.round(2))
[[0.27 0.33 0.31]
[0.6 0.67 0.52]
[1. 1. 1. ]
[0. 0. 0. ]]
# Standartlashtirish: o'rtacha 0, standart og'ish 1
standart = (belgilar - belgilar.mean(axis=0)) / belgilar.std(axis=0)
print(standart.round(2))
[[-0.35 -0.45 -0.5 ]
[ 0.53 0.45 -0.05]
[ 1.59 1.34 1.02]
[-1.77 -1.34 -1.46]]
maydon 40-150 oralig'ida, xonalar 1-4 oralig'ida. Ko'p algoritmlar
uchun bu muammo: katta sonli ustun natijaga nomutanosib ta'sir qiladi.
6-bo'limda buni scikit-learn vositalari bilan bajarishni ko'ramiz.
Foydali funksiyalar #
a = np.array([3, 1, 4, 1, 5, 9, 2, 6])
print(np.sort(a)) # [1 1 2 3 4 5 6 9]
print(np.argsort(a)) # tartiblangan indekslar
print(np.unique(a)) # takrorlanmagan qiymatlar
print(np.cumsum(a)) # jamlanuvchi yig'indi
b = np.array([1, 2, np.nan, 4])
print(np.isnan(b)) # [False False True False]
print(np.nanmean(b)) # 2.33 - NaN e'tiborsiz
# Birlashtirish
x = np.array([[1, 2], [3, 4]])
y = np.array([[5, 6]])
print(np.vstack([x, y])) # vertikal
print(np.hstack([x, x])) # gorizontal
- 1 dan 20 gacha sonlardan massiv yarating va faqat juftlarini chiqaring.
(4, 5)shaklidagi tasodifiy massiv yarating (seed=42).- Uning har bir ustuni uchun o'rtacha va standart og'ishni hisoblang.
- 100 dan katta elementlarni topib, ularni 100 ga almashtiring.
reshapebilan(20,)massivni(4, 5)va(5, 4)ga aylantiring.- Ikki massivning skalyar ko'paytmasini
np.dotbilan hisoblang. - Broadcasting bilan matritsaning har bir ustunidan uning o'rtachasini ayiring.
- Min-max normalizatsiya funksiyasini yozing.
np.wherebilan sonlarni "musbat"/"manfiy" deb belgilang.- Tsikl va vektorlashtirilgan amalning tezligini o'lchab solishtiring.
Xulosa #
- NumPy massivlari Python ro'yxatlaridan o'nlab barobar tezroq.
np.array,zeros,ones,arange,linspace- massiv yaratish usullari.np.random.seed()natijalarni takrorlanuvchi qiladi.- Kesish nusxa emas, ko'rinish qaytaradi -
.copy()ni unutmang. - Shartli tanlashda
&,|,~ishlatiladi, qavslar majburiy. - Vektorlashtirilgan amallar tsiklni almashtiradi - tsikl yozmang.
- Broadcasting turli shakldagi massivlarni birlashtiradi.
reshape(-1, 1)- scikit-learn uchun eng ko'p kerak bo'ladi.axis=0ustunlar bo'yicha,axis=1qatorlar bo'yicha hisoblaydi.
Keyingi bo'limda Pandas bilan jadvallarni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.