مقدمة إلى NumPy NumPy هي مكتبة أساسية للحوسبة العلمية في بايثون. توفر كائنات مصفوفات $N$-الأبعاد عالية الأداء ( ndarray ) وأدوات للعمل معها. أسرع بكثير من قوائم بايثون للعمليات الرقمية الكبيرة. استيراد NumPy import numpy as np إنشاء NumPy Arrays من قائمة بايثون arr1 = np.array([1, 2, 3]) arr2 = np.array([[1, 2], [3, 4]]) إنشاء مصفوفات خاصة الأصفار: np.zeros((rows, cols)) الآحاد: np.ones((rows, cols)) مصفوفة هوية: np.eye(size) نطاق: np.arange(start, stop, step) مسافة خطية: np.linspace(start, stop, num_points) عشوائي: np.random.rand(rows, cols) (توزيع موحد) عشوائي قياسي: np.random.randn(rows, cols) (توزيع طبيعي) zeros_arr = np.zeros((2, 3)) ones_arr = np.ones((1, 4)) identity_arr = np.eye(3) range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8] linspace_arr = np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ] خصائص المصفوفة الشكل: arr.shape (tuple يمثل الأبعاد) النوع: arr.dtype (نوع بيانات العناصر) عدد الأبعاد: arr.ndim عدد العناصر: arr.size a = np.array([[1, 2], [3, 4]]) print(a.shape) # (2, 2) print(a.dtype) # int64 (أو ما شابه) print(a.ndim) # 2 print(a.size) # 4 فهرسة وتقطيع المصفوفة عنصر واحد: arr[row, col] أو arr[index] لـ 1D. تقطيع الصفوف: arr[start:end, :] تقطيع الأعمدة: arr[:, start:end] التقطيع المتقدم: استخدام مصفوفات منطقية أو مصفوفات فهرس. arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr[0, 1]) # 2 print(arr[1:]) # [[4, 5, 6], [7, 8, 9]] print(arr[:, 0]) # [1, 4, 7] print(arr[arr > 5]) # [6, 7, 8, 9] (مصفوفة 1D) إعادة تشكيل وتعديل المصفوفة إعادة تشكيل: arr.reshape((new_rows, new_cols)) تسطيح: arr.flatten() أو arr.ravel() النقل: arr.T أو np.transpose(arr) ضم: np.concatenate((arr1, arr2), axis=0/1) تكديس عمودي: np.vstack((arr1, arr2)) تكديس أفقي: np.hstack((arr1, arr2)) arr = np.arange(9).reshape((3, 3)) # [[0, 1, 2], # [3, 4, 5], # [6, 7, 8]] reshaped = arr.reshape((1, 9)) flat = arr.flatten() # [0, 1, 2, 3, 4, 5, 6, 7, 8] transposed = arr.T # [[0, 3, 6], # [1, 4, 7], # [2, 5, 8]] العمليات الرياضية العمليات العنصرية (Element-wise Operations) الجمع: arr1 + arr2 الطرح: arr1 - arr2 الضرب: arr1 * arr2 (ليس ضرب المصفوفات!) القسمة: arr1 / arr2 القوة: arr ** power العمليات العددية: arr + 5 , arr * 2 ضرب المصفوفات ضرب المصفوفات: arr1 @ arr2 أو np.dot(arr1, arr2) a = np.array([1, 2]) b = np.array([3, 4]) print(a + b) # [4, 6] print(a * b) # [3, 8] (ضرب عنصري) mat1 = np.array([[1, 2], [3, 4]]) mat2 = np.array([[5, 6], [7, 8]]) print(mat1 @ mat2) # ضرب المصفوفات دوال تجميعية (Aggregation Functions) المجموع: np.sum(arr) أو arr.sum() المتوسط: np.mean(arr) أو arr.mean() الحد الأدنى: np.min(arr) أو arr.min() الحد الأقصى: np.max(arr) أو arr.max() الانحراف المعياري: np.std(arr) أو arr.std() التباين: np.var(arr) أو arr.var() يمكن تحديد المحور ( axis=0 للأعمدة، axis=1 للصفوف). arr = np.array([[1, 2], [3, 4]]) print(arr.sum()) # 10 print(arr.sum(axis=0)) # [4, 6] (مجموع الأعمدة) print(arr.mean(axis=1)) # [1.5, 3.5] (متوسط الصفوف) البث (Broadcasting) آلية قوية تسمح لـ NumPy بالعمل مع المصفوفات ذات الأشكال المختلفة عند إجراء العمليات الحسابية. يتم "تمديد" المصفوفة الأصغر لتتناسب مع شكل المصفوفة الأكبر. a = np.array([1, 2, 3]) b = 2 # عدد print(a + b) # [3, 4, 5] (b يتم بثها) c = np.array([[0], [1], [2]]) d = np.array([10, 11, 12]) print(c + d) # [[10, 11, 12], # [11, 12, 13], # [12, 13, 14]] الدوال العالمية (Universal Functions - ufuncs) دوال NumPy التي تعمل عنصريًا على ndarray . أمثلة: np.sqrt() , np.exp() , np.sin() , np.cos() , np.log() . arr = np.array([1, 4, 9]) print(np.sqrt(arr)) # [1. 2. 3.] حفظ وتحميل المصفوفات حفظ: np.save('filename.npy', arr) تحميل: loaded_arr = np.load('filename.npy')