Bu modul NumPy bilan haqiqiy ish: massiv ustida hisob-kitob, tuzilmani o’zgartirish, tasodifiy sonlar, saralash-filtrlash va Pandas’ga o’tish ko’prigi.
Matematik amallar va axis
Arifmetik amallar element bo’yicha ishlaydi, agregat funksiyalar esa butun massivni bitta songa (yoki qator/ustun bo’yicha massivga) yig’adi:
import numpy as np
savdo = np.array([[120, 90, 140],
[200, 150, 180]]) # 2 filial, 3 kun
print(savdo.sum()) # 880 — hammasi
print(savdo.sum(axis=0)) # [320 240 320] — har KUN bo'yicha (ustunlar)
print(savdo.sum(axis=1)) # [350 530] — har FILIAL bo'yicha (qatorlar)
print(savdo.mean(), savdo.max(), savdo.std())
axis — eng ko’p adashtiradigan tushuncha. Qoida: axis=0 — amal qatorlar bo’ylab pastga ketadi (natija: har ustun uchun bitta son), axis=1 — ustunlar bo’ylab o’ngga (natija: har qator uchun bitta son).
| Amal | Natija shakli (2×3 uchun) | Ma’nosi |
|---|---|---|
sum() |
skalyar | butun massiv yig’indisi |
sum(axis=0) |
(3,) | har bir ustun yig’indisi |
sum(axis=1) |
(2,) | har bir qator yig’indisi |
O’lchami mos ikki array ustida amal ham element bo’yicha: a + b, a * b (bu matritsa ko’paytmasi EMAS — u a @ b).
Tuzilmani o’zgartirish: reshape, flatten, T
a = np.arange(12) # [0 1 2 ... 11], shape (12,)
m = a.reshape(3, 4) # 3x4 matritsa
n = a.reshape(3, -1) # -1: "qolganini o'zing hisobla" -> 3x4
f = m.flatten() # yana tekis (12,) — nusxa
t = m.T # transpozitsiya: 4x3
reshape uchun elementlar soni mos kelishi shart: 12 elementni reshape(5, 3) qilsangiz — ValueError: cannot reshape array of size 12 into shape (5,3). -1 ni faqat bitta o’lchamda ishlatish mumkin — NumPy uni qolgan o’lchamlardan kelib chiqib o’zi hisoblaydi.
Tasodifiy sonlar
rng = np.random.default_rng(seed=42) # zamonaviy usul
print(rng.integers(1, 7, size=5)) # 5 ta zar tashlash
print(rng.random((2, 2))) # 0..1 oralig'ida 2x2
print(rng.normal(0, 1, 3)) # normal taqsimot
Natija:
[1 5 4 4 2]
[[0.22733602 0.31675834]
[0.79736546 0.67625467]]
[ 0.7611397 -0.86446043 0.14404357]
seed — tasodifiylikning boshlang’ich nuqtasi: bir xil seed bilan dastur har safar bir xil "tasodifiy" sonlarni beradi. Bu ilmiy ishda va darslarda natijani takrorlanadigan qilish uchun kerak. Eski uslub (np.random.seed(42) + np.random.rand(...)) ham keng uchraydi — videolardagi kod shu ko’rinishda bo’lishi mumkin, ikkalasi ham ishlaydi.
Saralash va filtrlash
a = np.array([40, 10, 55, 25])
print(np.sort(a)) # [10 25 40 55] — yangi array
print(np.argsort(a)) # [1 3 0 2] — saralangan tartib indekslari
a.sort() # joyida saralaydi (asl o'zgaradi!)
Filtrlashning kaliti — mantiqiy niqob (boolean mask): taqqoslash amali True/False massiv qaytaradi, uni indeks sifatida bersangiz, faqat True bo’lgan elementlar qoladi:
ballar = np.array([56, 90, 71, 44, 88])
print(ballar > 70) # [False True True False True]
print(ballar[ballar > 70]) # [90 71 88]
print(np.where(ballar > 70, "o'tdi", "yiqildi"))
Ikki shartni birlashtirishda and/or EMAS, &/| ishlatiladi va har bir shart qavsga olinadi: ballar[(ballar > 50) & (ballar < 90)]. and yozsangiz — ValueError: The truth value of an array ... is ambiguous.
NumPy va Pandas birgalikda
Pandas ichida NumPy yotadi: DataFrame ustunlari aslida NumPy massivlari. Shuning uchun ular orasida o’tish bir qadam:
import pandas as pd
df = pd.DataFrame({"narx": [120, 340, 95], "soni": [3, 1, 7]})
X = df.to_numpy() # DataFrame -> 2D array
s = df["narx"].to_numpy() # ustun -> 1D array
df2 = pd.DataFrame(np.arange(6).reshape(2, 3), columns=["a", "b", "c"])
NumPy’da o’rgangan hamma narsa — axis, mask bilan filtrlash, agregatlar — Pandas’da xuddi shu mantiq bilan ishlaydi. Keyingi kurs aynan shu poydevor ustiga quriladi.
Amaliyot
- 1 dan 24 gacha sonlarni
reshapebilan 4×6 matritsa qiling; har qator va har ustun yig’indisiniaxisbilan hisoblang. default_rng(7)bilan 100 ta talabaning ballarini (0–100 oralig’ida butun son) generatsiya qiling; o’rtacha va standart og’ishni toping.- Shu ballardan 60 dan pastlarini mask bilan ajratib oling va ular necha foizni tashkil qilishini hisoblang.
- Ballarni kamayish tartibida saralang (maslahat:
np.sort(...)[::-1]) va eng yuqori 10 tasini oling. - Ballar arrayidan
pd.DataFrameyasang, ungaholatustuni qo’shing:np.where(ball >= 60, "o’tdi", "yiqildi").
Modul testi keyingi darsda — konspektdagi misollarni o’zingiz terib ko’rgan bo’lsangiz, savollar oson tuyuladi.