عندما ترتب أعدادًا مركبة، تحتاج إلى تحديد ما تقارنه: الجزأين الحقيقي والتخيلي، أم مقدار كل عدد. في مثالنا وضعت sort_complex أكبر مقدار أولًا، بينما وضع الفرز بالمقدار هذا العدد أخيرًا. سنقرأ ترتيبين للقيم الخمس نفسها ونراجع سبب الاختلاف.
سم المفتاح الذي تريد ترتيبه
توثق sort_complex ترتيب المصفوفة المركبة باستعمال الحقيقي أولًا ثم التخيلي، وتعيد مصفوفة مركبة مرتبة. [1] لا نقرأ كلمة الفرز وحدها على أنها مقارنة للأطوال.
وتوضح قاعدة sort للمركبات ذات الجزأين غير NaN أن الحقيقي يحسم المقارنة، إلا عند تساويه؛ حينها يحسم التخيلي. [4] قرأنا هذه القاعدة للتفسير ولم نستدع np.sort في التجربة.
تحسب np.abs المقدار عنصرًا بعنصر؛ للمركب a+bj هو √(a²+b²). [2] هذا عدد حقيقي غير سالب في أمثلتنا، وهو مفتاح آخر يمكننا التصريح به.
تعيد argsort فهارس ترتيب، وفي البعد الواحد اختيار المدخل بتلك الفهارس يعطي القيم المرتبة. [3] نحسب الفهارس هنا من المقادير، ثم نطبقها على الأعداد المركبة الأصلية.
تابع أولوية الجزأين في خمسة أعداد
أنشأنا z=np.array([-2+9j,-2-4j,1+3j,-3+12j,-1j],dtype=np.complex128)، في NumPy 2.3.5 على CPython 3.12.14. القيم مؤلفة بلا وحدة قياس، والشكل (5,)؛ نرمز بالفهارس من صفر إلى أربعة لمواضع البداية.
أعادت np.sort_complex(z) القيم [-3+12j,-2-4j,-2+9j,-1j,1+3j]. الخرج complex128 بالشكل (5,). بقيت بايتات z الأصلية ثابتة خلال الاستدعاءات والاختيار بالفهارس.
الحقيقي −3 يتقدم على −2 و0 و1، لذلك جاء −3+12j أولًا دون أن نستخدم المقدار معيارًا. داخل الزوج ذي الحقيقي −2، نجد −4 أقل من 9، فيأتي −2−4j قبل −2+9j.
فهارس هذا الترتيب بالنسبة إلى المصدر هي [3,1,0,4,2]؛ نستخرجها من مطابقة الأزواج المؤلفة، ولم تطلب التجربة argsort على المركبات نفسها. ترتيب الأجزاء المحدد لا نعرضه بوصفه علاقة «أكبر» عامة بين الأعداد المركبة.
غير المفتاح إلى المقدار ثم افحص التحكم
مربعات المقادير في ترتيب المصدر هي [85,20,10,153,1]. نحسبها من الأزواج الصحيحة: مثلًا (−3)²+12²=153، بينما 0²+(−1)²=1. لذلك أكبر مقدار يخص العنصر الذي وضعه sort_complex أولًا.
نفذنا m=np.abs(z)، ثم p=np.argsort(m)، ثم y=z[p]. كانت p=[4,2,1,0,3]، وأعطى الاختيار [-1j,1+3j,-2-4j,-2+9j,-3+12j]. فهارس p مواضع في المصدر، وليست مقادير الأعداد.
الترتيب الجديد يقرأ مربعات المقادير [1,10,20,85,153] تصاعديًا. كل المقادير الخمسة مختلفة هنا، لذلك لا نحتاج سياسة ترتيب للمتعادلين بالمقدار لكي نفسر نتيجة هذا المثال.
أنشأنا تحكمًا مستقلًا من [7+0j,3+0j,9+0j,1+0j,5+0j]، بالنوع والشكل نفسيهما. أعاد المساران [1+0j,3+0j,5+0j,7+0j,9+0j]؛ المقادير في هذا التحكم تساوي الأجزاء الحقيقية الموجبة.
اتفاق التحكم لا يثبت تكافؤ القاعدتين لجميع المركبات. حافظنا على تعريف كل مفتاح، ثم قارنا ناتجيه؛ لا نختار تعريفًا جديدًا للفرز بعد رؤية اتفاق حالة واحدة.

حدد عدد النتائج وحدود الدليل
ضربنا الجزأين في كل عدد من أعداد المثال بعامل صحيح موجب q من 1 إلى 17، وأنشأنا أصلًا جديدًا لكل عامل. أضفنا التحكم السابق، فصار لدينا 18 مدخلًا مختلفًا عدديًا وببايتاته.
لكل مدخل استدعاء sort_complex واستدعاء abs واستدعاء argsort؛ المجموع 18×3=54. اختيارات z[p] الثمانية عشر خارج عد هذه الاستدعاءات المسماة. بقي المدخل الأصلي ثابتًا في الحالات كلها.
حفظنا 90 قيمة مقدار و90 فهرسًا صحيحًا، و180 عددًا مركبًا من الترتيبين؛ بعد عد جزأي كل عدد مركب نحصل على 360+90+90=540 قيمة عددية. اختلف الترتيبان في الحالات السبع عشرة، واتفقا في التحكم الوحيد.
بنى مرجع Python ترتيب الأزواج بحسب الحقيقي والتخيلي، وفهارس المقدار بحسب مربعاته الصحيحة. حسب الجذور بعمل Decimal ذي دقة 100 رقم؛ أكبر فرق في المقادير العائمة كان نحو 2.85e−14، ضمن سماح مطلق 1e−12. لم يولد المرجع توقعه بدوال NumPy المختبرة.
اقتصر التشغيل على خمسة عناصر complex128 محدودة وأحادية البعد. لم نفحص تعادل المقادير أو تكرار مركب كامل أو ضمان الاستقرار أو NaN واللانهاية أو الأنواع والأبعاد الأخرى أو فرز الطور أو الأداء والذاكرة أو بيانات قياس. احتفظ باسم المفتاح مع الترتيب الذي تنقله.
| موضع الناتج | sort_complex | فرز المقدار |
|---|---|---|
| 0 | -3+12j | -1j |
| 1 | -2-4j | 1+3j |
| 2 | -2+9j | -2-4j |
| 3 | -1j | -2+9j |
| 4 | 1+3j | -3+12j |
للتوسع: قراءة فهارس الترتيب.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
