अध्याय ३ · खण्ड I · 26 मिनेट
NumPy: सङ्ख्याको एरेसँग काम
NumPy ले सङ्ख्याहरूको Python सूचीलाई हजार गुणा छिटो सञ्चालन गर्न मिल्ने केहीमा बदल्छ। एआई इकोसिस्टमका हरेक सङ्ख्यात्मक पुस्तकालय — pandas, scikit-learn, PyTorch — यसैमाथि बनेका छन्।
पछिल्लो अध्यायमा तपाईंले सङ्ख्याहरूलाई सादा Python सूचीमा राख्नुभयो। पाँच वा दशका लागि त्यो ठीक छ। पचास लाखका लागि — एक वर्षको हरेक खल्ती कारोबार, वा एक दिनमा नेपालभरको हरेक मौसम पढाइ — सादा Python सूची दर्दनाक रूपमा ढिलो हुन्छन्। NumPy त्यो पुस्तकालय हो जुन सूची छिटो नभएकोबित्तिकै हरेक सङ्ख्यात्मक Python कार्यक्रमले समात्छ। बाँकी ट्र्याकका सबै काम यसैमाथि बस्छन्।
NumPy स्थापना
यदि पहिले नै गर्नुभएको छैन भने, परियोजनामा स्थापना गर्नुहोस्। परियोजना फोल्डरबाट टर्मिनलमा:
pip install numpy
नोटबुकमा सेलको सुरुमा ! लगाएर पनि उही गर्न सकिन्छ:
!pip install numpy
यो प्रति परियोजना एक पटक मात्र गर्ने हो। (हामी अध्याय 4 मा “प्रति परियोजना” को अर्थ ठीकसँग बुझ्नेछौं।)
काम गरेको जाँच्न, नोटबुक सेलमा:
import numpy as np
print(np.__version__)
import numpy as np विश्वव्यापी संयम हो। झन्डै हरेक NumPy ट्युटोरियल, पुस्तकालय, र पुस्तकमा छोटो नाम np हुन्छ। भीडलाई पछ्याउनुहोस्।
तपाईंको पहिलो एरे
एरे सूचीको NumPy संस्करण हो। Python सूचीबाट बनाउनुहोस्:
import numpy as np
temps = np.array([22.4, 24.1, 19.8, 21.7, 23.0])
print(temps)
यसले प्रिन्ट गर्छ:
[22.4 24.1 19.8 21.7 23. ]
बिना अल्पविरामको सूची जस्तो देखिन्छ। लगभग त्यही नै हो — तर गणित गर्न धेरै छिटो, किनभने NumPy ले भित्री रूपमा सङ्ख्याहरूलाई स्मरणको एउटै कसिएको ब्लकमा भण्डारण गर्छ र अनुकूलित C कोडले सञ्चालन गर्छ।
केही उपयोगी निर्मित:
temps.mean() # 22.2 — औसत
temps.max() # 24.1
temps.min() # 19.8
temps.sum() # 111.0
len(temps) # 5
temps.shape # (5,) — एरेको आयाम
shape NumPy को सबैभन्दा महत्त्वपूर्ण अवधारणामध्ये एक हो। हामी एकैछिनमा दुई-आयामिक एरेमा पुग्नेछौं, र पुगेपछि आकार थाहा हुनु आवश्यक हुन्छ।
ठूलो विचार: भेक्टराइजेसन
सादा Python मा, सेल्सियस तापक्रमलाई फरेनहाइटमा बदल्न लूप लेख्नुपर्थ्यो:
celsius = [22.4, 24.1, 19.8, 21.7, 23.0]
fahrenheit = []
for c in celsius:
fahrenheit.append(c * 9 / 5 + 32)
NumPy मा, तपाईं जे चाहनुहुन्छ त्यही लेख्नुहोस्:
celsius = np.array([22.4, 24.1, 19.8, 21.7, 23.0])
fahrenheit = celsius * 9 / 5 + 32
एउटै लाइन। लूप छैन। NumPy ले सञ्चालनलाई एकैचोटि हरेक तत्त्वमा लागू गर्छ, र छिटो कम्पाइल गरिएको कोडमा गर्छ। यसलाई भेक्टराइजेसन भनिन्छ, र NumPy अस्तित्वमा रहनुको एकल सबैभन्दा ठूलो कारण यही हो। एक पटक तपाईंले आत्मसात् गर्नुभयो भने धेरै फरक कोड लेख्नुहुन्छ।
केही थप उदाहरण:
temps + 5 # हरेक तापक्रममा 5 थप्नुहोस्
temps * 2 # हरेक तापक्रमलाई दोब्बर बनाउनुहोस्
temps > 22 # True/False को एरे — हरेक तापक्रम 22 भन्दा माथि हो?
temps[temps > 22] # 22 भन्दा माथिका तापक्रम मात्र
अन्तिम लाइन सानो प्रकाशन हो। NumPy ले तपाईंलाई सर्तले सूचकाङ्क गर्न दिन्छ — बुलियनको एरे दिनुहोस् र यसले शर्त सत्य भएको तत्त्व फिर्ता दिन्छ। यो ढाँचालाई बुलियन मास्किङ भनिन्छ, र वास्तविक डाटा कामका हरेक ठाउँमा छ।
दुई आयाम: सानो म्याट्रिक्स
वास्तविक डाटा विरलै एउटै पङ्क्ति हुन्छ। यो पङ्क्ति र स्तम्भ हुन्छन् — मौसम स्टेसनहरूको सूची, प्रत्येकमा सात दिनका पढाइ; खल्ती खाताहरूको सूची, प्रत्येकमा एक वर्षको मासिक मौज्दात। NumPy ले यसलाई 2D एरे ले सम्हाल्छ:
readings = np.array([
[22.4, 24.1, 19.8, 21.7, 23.0], # काठमाडौं
[28.6, 29.1, 27.4, 28.9, 28.3], # बीरगन्ज
[15.2, 16.4, 14.0, 15.8, 15.1], # जोमसोम
])
print(readings.shape) # (3, 5) — 3 पङ्क्ति, 5 स्तम्भ
print(readings.mean()) # सबैको औसत
print(readings.mean(axis=1)) # प्रति पङ्क्ति औसत → प्रति शहर
print(readings.mean(axis=0)) # प्रति स्तम्भ औसत → प्रति दिन
shape ले पङ्क्ति र स्तम्भको सङ्ख्या भन्छ। axis=1 ले “स्तम्भ खुम्च्याउनुहोस्, प्रति पङ्क्ति एउटा मान दिनुहोस्” भन्छ। axis=0 ले “पङ्क्ति खुम्च्याउनुहोस्, प्रति स्तम्भ एउटा मान दिनुहोस्” भन्छ। axis सानो विचार हो जुन पहिलो तीन-चार पटक प्रयोग गर्दा गलत हुन्छ; यो सामान्य हो।
विशिष्ट पङ्क्ति र स्तम्भमा पनि सूचकाङ्क लगाउन सकिन्छ:
readings[0] # पहिलो पङ्क्ति — काठमाडौंका सबै पढाइ
readings[0, 2] # पङ्क्ति 0, स्तम्भ 2 — काठमाडौंको तेस्रो दिनको पढाइ
readings[:, 2] # स्तम्भ 2 — हरेक शहरको तेस्रो दिनको पढाइ
कोलोनको अर्थ “यो अक्षको सबै” हो।
सय पटक लेख्ने सामान्य सञ्चालन
सानो सूची, सबै नोटबुकमा प्रयास गर्नुहोस् क्विजअघि:
np.zeros(5) # पाँच शून्यको एरे
np.ones((3, 4)) # 3×4 एकहरूको एरे
np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
np.linspace(0, 1, 11) # [0.0, 0.1, 0.2, ..., 1.0] — 11 समान दूरीका
np.random.rand(5) # 0 र 1 बीचका 5 अनियमित दशमलव
np.arange Python को range को NumPy संस्करण हो। np.linspace अमूल्य छ जब निश्चित सङ्ख्याका समान दूरीका बिन्दु चाहिन्छ (जस्तै, प्लट गर्न)। np.random.rand केहीको परीक्षण गर्दा सस्तो नक्कली डाटा बनाउने तरिका हो।
आफ्नो बुझाइ जाँच्नुहोस्
Quick check
—यो कोडले के प्रिन्ट गर्छ? import numpy as np a = np.array([10, 20, 30, 40, 50]) print((a > 25).sum())
Quick check
—2D एरेको shape (4, 6) छ। कुन सही हो?
अब के आउँछ
NumPy इन्जिन हो। अर्को खण्डको pandas अधिक सामान्य अवस्थाका लागि मित्रवत् इन्टरफेस हो: नाम भएका स्तम्भहरूसहितको तालिका। Pandas DataFrames प्रत्यक्ष NumPy एरेहरूमाथि बनेका छन् — तपाईंले भर्खर भेटेका सबै गति-फाइदाहरू अघि सर्छन्, स्तम्भ सूचकाङ्कको सट्टा नामको थप सुविधासहित। त्यसपछि matplotlib ले तपाईंका सङ्ख्याहरूले के गरिरहेका छन् अन्ततः देख्न दिन्छ।