لماذا المصفوفات وما هي المصفوفة
تستطيع قائمة بايثون أن تحمل أي شيء، مما يجعلها مرنة لكنها بطيئة للأرقام: فكل عنصر كائن مستقل. تضيف NumPy النوع ndarray، وهو كتلة من الذاكرة تحمل أرقامًا من نوع واحد متتابعة. والعمل على الكتلة كلها بكود مُترجَم أسرع عادةً بعشرات المرات من حلقة بايثون ويستهلك ذاكرة أقل بكثير. وتُبنى عليها تقريبًا كل مكتبة كمية (pandas وSciPy وscikit-learn). وتُستورد عُرفًا بـimport numpy as np.
import numpy as np
# Create arrays
prices = np.array([184.25, 185.0, 183.2])
print(prices) # [184.25 185. 183.2 ]
print(np.zeros(3)) # [0. 0. 0.]
print(np.arange(0, 10, 3)) # [0 3 6 9]
print(np.linspace(0, 1, 5)) # [0. 0.25 0.5 0.75 1. ]
# An array knows its shape
table = np.array([[1, 2, 3], [4, 5, 6]])
print(table.shape, table.ndim, table.size) # (2, 3) 2 6إنشاء المصفوفات
تحوّل np.array(list) قائمة (أو قائمة قوائم لبُعدين). وتصنع np.zeros(n) وnp.ones(n) مصفوفات ممتلئة، وتأخذ np.zeros((rows, cols)) صفًا للشكل. وتعمل np.arange(start, stop, step) مثل range لكنها تسمح بخطوات عشرية وتستثني stop؛ وبسبب التقريب فضّل np.linspace(start, stop, num) التي تعطي num نقطة متباعدة بانتظام وتشمل الطرفين. ولكل مصفوفة .shape (الحجم في كل بُعد) و.ndim (عدد الأبعاد) و.size (العدد الكلي للعناصر).
import numpy as np
# arange with floats can surprise; linspace gives exactly the points you ask for
print(len(np.arange(0, 1, 0.1))) # 10 (1.0 is excluded)
print(len(np.linspace(0, 1, 11))) # 11 (both ends included)
# Shapes and sizes
grid = np.zeros((3, 4))
print(grid.shape, grid.ndim, grid.size) # (3, 4) 2 12
print(np.ones(2) * 5) # [5. 5.]dtype: نوع واحد للمصفوفة كلها
لكل مصفوفة dtype: int64 (أعداد صحيحة) وfloat64 (أعداد عشرية) وbool ونسخ أصغر أو أكبر مثل float32 أو int8. تختار NumPy النوع من البيانات: الأعداد الصحيحة تعطي int64، وعدد عشري واحد يحوّل كل شيء إلى float64، وnp.nan (ليس رقمًا، علامة القيمة المفقودة) عدد عشري فيفرض float64. اختر النوع بنفسك بـdtype=... أو حوّل بـ.astype(...) التي تُرجع مصفوفة جديدة. والنوع الأصغر يوفّر ذاكرة (float32 نصف float64) على حساب الدقة.
import numpy as np
print(np.array([1, 2, 3]).dtype) # int64
print(np.array([1, 2.5, 3]).dtype) # float64 (one decimal upgrades everything)
print(np.array([True, False]).dtype) # bool
print(np.array([1, 2, np.nan])) # [ 1. 2. nan] (nan is a float)
# astype returns a new array; smaller dtypes use less memory
prices = np.zeros(1000)
print(prices.nbytes) # 8000
print(prices.astype(np.float32).nbytes) # 4000
print(np.array(["1.5", "2"], dtype=float)) # [1.5 2. ] (text converted to numbers)مزالق التحويل: البتر والفيض
يؤدي تحويل الأعداد العشرية إلى صحيحة بـ.astype(int) إلى البتر نحو الصفر، ولا تمثّل الأعداد العشرية معظم الكسور تمثيلًا دقيقًا، فـ19.99 * 100 تساوي 1998.9999999999998 وتُبتر إلى 1998 أي أقل بسنت. ولتحويل الأسعار إلى سنتات صحيحة قرّب أولًا: np.round(prices * 100).astype(np.int64). وللأنواع الصحيحة أيضًا مدى ثابت وتلتف بصمت: فـint8 يحمل من -128 إلى 127 فتصبح 100 * 2 هي -56. استخدم int64 للمال والعدّ، وتذكّر أن قسمة الأعداد الصحيحة بـ/ تعطي دائمًا أعدادًا عشرية بينما تقرّب // للأسفل.
import numpy as np
# Truncation: astype(int) cuts the decimals off
print(np.array([1.9, -1.9]).astype(int)) # [ 1 -1]
print(19.99 * 100, int(19.99 * 100)) # 1998.9999999999998 1998
print(np.round(np.array([19.99]) * 100).astype(np.int64)) # [1999]
# Overflow: an int8 wraps around silently
small = np.array([100, 50], dtype=np.int8)
print(small * 2) # [-56 100]
# / always gives floats, // floors
counts = np.array([1, 2, 3])
print(counts / 2, counts // 2) # [0.5 1. 1.5] [0 1 1].shape و.dtype لكل مصفوفة معنية: فوجود int64 مفاجئ حيث توقعت float64 أو شكل (5, 1) بدل (5,) يفسّر معظم الأخطاء. فضّل بناء المصفوفات بدوال NumPy (np.linspace وnp.asarray وastype) بدل حلقات بايثون؛ وترفض المختبرات الحلقات لهذا السبب بالتحديد.np.arrayوzerosوonesوarangeوlinspaceتنشئ المصفوفات؛ و.shapeو.ndimو.sizeتصفها.- نوع واحد لكل مصفوفة:
int64وfloat64وbool؛ وastypeتحوّل إلى مصفوفة جديدة. astype(int)تبتر (قرّب أولًا)؛ وأنواع الأعداد الصحيحة الصغيرة تلتف بصمت؛ وnanيفرض الأعداد العشرية.
التالي: فهرسة المصفوفات وتقطيعها، لانتقاء الصفوف والأعمدة والنوافذ والقيم التي تحقق شرطًا.
المختبر: ما الذي يُقيَّم
- ارسم نقاطًا متباعدة بانتظام باستخدام
make_grid25 نقطة - حوّل قيمًا خامًا مختلطة إلى أعداد عشرية باستخدام
to_float_array25 نقطة - أبلغ عن الشكل والحجم والـ dtype باستخدام
describe_array25 نقطة - حوّل الأسعار إلى سنتات صحيحة بأمان باستخدام
to_cents25 نقطة