NumPy: المصفوفات المهيكلة
آخر تحديث: 2026-08-26
1. ما ستتعلمه
- ❶ إنشاء مصفوفات مهيكلة بأنواع بيانات متعددة
- ❷ الوصول إلى الحقول بالاسم
- ❸ مصفوفات السجلات للوصول بنمط الخصائص
- ❹ فرز وتصفية المصفوفات المهيكلة
2. المفاهيم الأساسية
PYTHON
import numpy as np
# تعريف نوع مهيكل
dt = np.dtype([('name', 'U10'), ('age', 'i4'), ('salary', 'f8')])
---
## 3. إنشاء مصفوفة
employees = np.array([
('Alice', 30, 75000.0),
('Bob', 25, 62000.0),
('Charlie', 35, 85000.0),
('Diana', 28, 71000.0)
], dtype=dt)
---
## 4. الوصول إلى الحقول
print(employees['name']) # ['Alice' 'Bob' 'Charlie' 'Diana']
print(employees['salary']) # [75000. 62000. 85000. 71000.]
---
## 5. مصفوفة سجلات (وصول بالخاصية)
emp_rec = np.rec.array(employees)
print(emp_rec.name) # ['Alice' 'Bob' 'Charlie' 'Diana']
print(emp_rec.salary) # [75000. 62000. 85000. 71000.]
---
## 6. التصفية
print(employees[employees['salary'] > 70000]['name'])
---
## 7. ['Alice' 'Charlie']
---
## 8. الفرز
sorted_emp = np.sort(employees, order='salary')
print(sorted_emp['name']) # ['Bob' 'Diana' 'Alice' 'Charlie']
TEXT
📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال: إنشاء والوصول إلى المصفوفات المهيكلة (الصعوبة ⭐)
PYTHON
import numpy as np
dt = np.dtype([('product', 'U15'), ('price', 'f8'), ('quantity', 'i4')])
inventory = np.array([
('Widget', 9.99, 100),
('Gadget', 24.99, 50),
('Doohickey', 4.99, 200),
('Thingamajig', 14.99, 75)
], dtype=dt)
print("Products:", inventory['product'])
print("Prices:", inventory['price'])
print("Total value:", np.sum(inventory['price'] * inventory['quantity']))
المخرجات:
TEXT
📖 للعرض فقط
Products:
Prices:
Total value:
المخرجات:
TEXT 📖 للعرض فقطProducts: ['Widget' 'Gadget' 'Doohickey' 'Thingamajig'] Prices: [ 9.99 24.99 4.99 14.99] Total value: 4396.0
▶ مثال: تصفية المصفوفات المهيكلة (الصعوبة ⭐⭐)
PYTHON
import numpy as np
dt = np.dtype([('name', 'U15'), ('age', 'i4'), ('salary', 'f8')])
employees = np.array([
('Alice', 30, 75000), ('Bob', 25, 62000),
('Charlie', 35, 85000), ('Diana', 28, 71000),
('Eve', 45, 95000), ('Frank', 32, 78000)
], dtype=dt)
---
## 9. تصفية: الراتب > 70000 AND العمر < 40
mask = (employees['salary'] > 70000) & (employees['age'] < 40)
filtered = employees[mask]
print("Filtered:", filtered['name'])
---
## 10. متوسط الراتب حسب الفئة العمرية
young = employees[employees['age'] < 30]
print("Young avg salary:", young['salary'].mean())
المخرجات:
TEXT
📖 للعرض فقط
Filtered:
Young avg salary:
المخرجات:
TEXT 📖 للعرض فقطFiltered: ['Alice' 'Charlie' 'Frank'] Young avg salary: 66500.0
▶ مثال: فرز المصفوفات المهيكلة حسب الحقل (الصعوبة ⭐⭐)
PYTHON
import numpy as np
dt = np.dtype([('city', 'U15'), ('population', 'i4'), ('area', 'f8')])
cities = np.array([
('Tokyo', 13960000, 2194), ('Delhi', 16780000, 1484),
('Shanghai', 24870000, 6341), ('Mumbai', 12440000, 603),
('Beijing', 21540000, 16411)
], dtype=dt)
---
## 11. فرز حسب عدد السكان تنازليًا
by_pop = np.sort(cities, order='population')[::-1]
print("By population:", by_pop['city'])
---
## 12. فرز حسب الكثافة (عدد السكان / المساحة)
density = cities['population'] / cities['area']
dense_idx = np.argsort(-density)
print("By density:", cities['city'][dense_idx])
المخرجات:
TEXT
📖 للعرض فقط
By population:
By density:
المخرجات:
TEXT 📖 للعرض فقطBy population: ['Shanghai' 'Beijing' 'Delhi' 'Tokyo' 'Mumbai'] By density: ['Mumbai' 'Delhi' 'Tokyo' 'Shanghai' 'Beijing']
س متى يجب استخدام المصفوفات المهيكلة مقابل Pandas؟
ج استخدم المصفوفات المهيكلة عندما تحتاج سرعة NumPy وكفاءة الذاكرة للعمليات المتجانسة. استخدم Pandas لتحليل بيانات أكثر تعقيدًا مع التوسيم والتجميع ومعالجة البيانات المفقودة.
س هل يمكنني إضافة حقول إلى مصفوفة مهيكلة موجودة؟
ج لا — المصفوفات المهيكلة لها dtype ثابت. أنشئ dtype جديد بالحقول الإضافية وانسخ البيانات. استخدم
np.lib.recfunctions.append_fields للتسهيل.س ما الفرق بين المصفوفة المهيكلة ومصفوفة السجلات (recarray)؟
ج مصفوفة السجلات تسمح بالوصول بالخاصية (
emp.name) بالإضافة إلى الوصول بالحقل (emp['name']). إنها أبطأ قليلاً لكنها أكثر ملاءمة.❓ أسئلة شائعة
س ما هو أهم شيء يجب تذكره؟
ج عمليات NumPy متجهة — تجنب حلقات Python لأداء أفضل.
س أين يمكنني معرفة المزيد؟
ج اطّلع على وثائق NumPy الرسمية على numpy.org للمراجع التفصيلية والمواضيع المتقدمة.
س هل يعمل هذا مع NumPy 2.x؟
ج نعم — جميع الأمثلة متوافقة مع NumPy 2.x. بعض الواجهات القديمة (مثل np.random.seed) لا تزال مدعومة لكن البدائل الحديثة موصى بها.
📖 ملخص
- المصفوفات المهيكلة تخزن أنواعًا مختلطة في ndarray واحد باستخدام أنواع مركبة (compound dtypes)
- الوصول إلى الحقول بالاسم:
arr['fieldname'] - مصفوفات السجلات تتيح الوصول بنمط الخصائص:
arr.fieldname - التصفية والفرز حسب قيم الحقول باستخدام الأقنعة المنطقية و
np.sort - للبيانات الجدولية المعقدة، فكر في استخدام Pandas DataFrames
📝 تمارين
-
مبتدئ (الصعوبة ⭐): أنشئ مصفوفة مهيكلة بحقول: product (U20)، price (f8)، quantity (i4). أضف 5 منتجات.
-
متوسط (الصعوبة ⭐⭐): من مصفوفة المنتجات، صفّ العناصر ذات السعر > 50 والكمية < 10. رتب حسب السعر تنازليًا.
-
متقدم (الصعوبة ⭐⭐⭐): استخدم
np.lib.recfunctionsلإضافة حقل 'total_value' (السعر × الكمية) إلى المصفوفة. تحقق من صحة الحساب.