المواضع والشرائح، الآن في أبعاد متعددة
تُفهرس المصفوفات مثل القوائم: a[0] أول عنصر وa[-1] الأخير وa[start:stop:step] شريحة تتوقف قبل stop. والفرق أن المصفوفة قد تكون متعددة الأبعاد، فتعطي فهرسًا أو شريحة لكل بُعد مفصولة بفواصل: m[row, column]. وتعني : وحدها «كل هذا البُعد»، فـm[:, 1] هو العمود الثاني كله وm[1] (أو m[1, :]) هو الصف الثاني كله. والأرقام السالبة تعدّ من النهاية، وخطوة -1 تعكس الترتيب.
import numpy as np
a = np.array([10., 11., 12., 13., 14., 15.])
print(a[0], a[-1]) # 10.0 15.0
print(a[1:4]) # [11. 12. 13.]
print(a[-2:]) # [14. 15.]
print(a[::2]) # [10. 12. 14.]
print(a[::-1]) # [15. 14. 13. 12. 11. 10.]
# Two dimensions: one index or slice per dimension
m = np.arange(12).reshape(3, 4)
print(m[1, 2]) # 6
print(m[:, 1]) # [1 5 9] the whole second column
print(m[-1, :]) # [ 8 9 10 11] the last row
print(m[0:2, 1:3]) # [[1 2]
# [5 6]]الشرائح عروض لا نسخ
على خلاف شريحة القائمة لا تنسخ الشريحة الأساسية في NumPy البيانات: بل هي عرض (view) على الذاكرة نفسها، فالكتابة عبرها تغيّر المصفوفة الأصلية. وهذا يجعل التقطيع فوريًا حتى للمصفوفات الضخمة لكنه يفاجئ الناس: فـpart = a[1:4]; part[0] = 99 يغيّر a[1] أيضًا. وحين تحتاج مصفوفة مستقلة استدعِ .copy(). ويمكنك التحقق بـnp.shares_memory(a, b). والسلوك نفسه ينطبق على الصفوف والأعمدة والخطوات والشرائح المعكوسة.
import numpy as np
a = np.array([10., 11., 12., 13., 14., 15.])
part = a[1:4] # a view, no data copied
part[0] = 99
print(a) # [10. 99. 12. 13. 14. 15.] a changed too
safe = a[1:4].copy() # an independent array
safe[0] = -1
print(a) # [10. 99. 12. 13. 14. 15.] unchanged
print(np.shares_memory(a, a[::2])) # True
print(np.shares_memory(a, safe)) # Falseالأقنعة المنطقية وقوائم الفهارس
تعطي مقارنة مصفوفة مصفوفةً من القيم المنطقية بالحجم نفسه: r > 0 هي True حيث العائد موجب. وباستخدام هذا القناع فهرسًا، r[r > 0]، تُنتقى تلك العناصر فقط. اجمع الشروط بـ& (و) و| (أو) و~ (ليس)، كل شرط بين قوسين، لأن and/or في بايثون لا تعملان على المصفوفات. وتصلح قائمة أو مصفوفة أعداد صحيحة أيضًا a[[0, 2, 5]] فتأخذ تلك المواضع بذلك الترتيب. والانتقاء بالقناع أو بقائمة الفهارس ينسخ البيانات، ويمكنك الإسناد عبر قناع أيضًا: a[a > 3] = 0.
import numpy as np
r = np.array([0.01, -0.02, 0.03, -0.01, 0.0, 0.02])
print(r > 0) # [ True False True False False True]
print(r[r > 0]) # [0.01 0.03 0.02]
print(r[(r > 0) & (r < 0.025)]) # [0.01 0.02] parentheses are required
print(np.where(r > 0)[0]) # [0 2 5] positions where it holds
# Pick by position, in any order
w = np.array([3.0, 9.0, 1.0, 7.0])
order = np.argsort(-w) # positions from the largest value down
print(order[:2], w[order[:2]]) # [1 3] [9. 7.]
# Assign through a mask
counts = np.array([1, 2, 3, 4, 5, 6])
counts[counts > 3] = 0
print(counts) # [1 2 3 0 0 0]import numpy as np
# Rows are days, columns are assets (AAPL, MSFT, GOOG)
R = np.array([[ 0.02, -0.01, 0.03],
[ 0.01, 0.00, 0.02],
[-0.03, 0.02, -0.01],
[ 0.00, 0.01, 0.04]])
print(R[:, [0, 2]]) # the AAPL and GOOG columns, as a copy
print(R[R[:, 0] > 0]) # the days on which AAPL rose (whole rows)
print(R[R[:, 0] > 0].shape) # (2, 3)
print(R[-2:, 1].mean()) # 0.015 last two days of MSFTa[1:4] وm[:, 1] وa[::2]) عروض؛ أما الأقنعة وقوائم الفهارس (a[a > 0] وa[[0, 2]]) فنُسخ. والدالة التي تُرجع شريحة من وسيطها تعطي المستدعي نافذة على بياناته نفسها، فقد تغيّرها كتابة لاحقة على نحو غير متوقع. قرّر عن قصد: أرجع عرضًا حين تهم السرعة وتكون البيانات للقراءة فقط، وإلا فـ.copy(). وتفحص اختبارات المختبر السلوكين.- فهرس أو شريحة لكل بُعد:
m[row, col]وm[:, 1](عمود) وm[-1](آخر صف) وa[::-1]. - الشرائح الأساسية عروض (الكتابة تنعكس؛ و
.copy()للفصل)؛ والأقنعة وقوائم الفهارس تصنع نسخًا. - الأقنعة:
a[a > 0]وتُجمع بـ&و|و~بين أقواس؛ وnp.argsortتعطي المواضع بترتيب الفرز.
التالي: التوجيه (vectorisation)، استبدال حلقات بايثون بحساب على مصفوفات كاملة.
المختبر: ما الذي يُقيَّم
- خذ أحدث الصفوف باستخدام
last_rows25 نقطة - احتفظ بالمكاسب فقط باستخدام
positive_values25 نقطة - خذ عيّنة كل k قيمة باستخدام
every_kth25 نقطة - اعثر على مواضع أكبر k قيمة باستخدام
top_k_indices25 نقطة