علوم وفضاء

ediff1d: من أين جاء الفرق بين صفين؟

جدول المثال مع فرقين عند عبور الصفوف.
13 و−13 يأتيان من زوجين بين الصفوف.

في مثالنا، تساوى مجموع الفروق رغم وجود انتقالين إضافيين بين الصفوف.

حدد الزوج الذي يدخل الفرق

ediff1d تسطح المدخل قبل الفرق؛ diff تحسب الفرق على المحور المختار. [1] [2]

نسأل عن معنى الجوار في جدول ذي صفوف: هل نقارن كل قيمة بجارتها داخل الصف نفسه، أم نكمل المسار إلى أول قيمة في الصف التالي؟ نثبت المدخل ونفصل هذين الاختيارين.

في NumPy 2.3.5 على CPython 3.12.14، أنشأنا A=np.array([[5,8,-2],[11,3,9],[-4,6,1]],dtype=np.int64). شكلها (3,3)، وأعدادها مؤلفة بلا وحدة قياس؛ ليست قراءات جهاز أو سجلًا زمنيًا.

أجرينا np.ediff1d(A) دون إضافات طرفية، وnp.diff(A,axis=1) للفرق الأول. نحدد axis=1 صراحة في المقارنة، فلا نحمل معنى الصفوف على اسم الدالة وحده.

طرح التالية من السابقة سيعكس الإشارة؛ حسابنا هو التالية ناقص السابقة. ولم نعلن فاصلًا زمنيًا أو مكانيًا، فلا نحول هذه الفروق إلى معدل أو مشتقة.

ستة فروق داخلية وفرقان بين الصفوف

أعطى np.diff(A,axis=1) القيم [[3,-10],[-8,6],[10,-5]] بالشكل (3,2). للصف الأول: 8−5=3 و−2−8=−10. للثاني: 3−11=−8 و9−3=6. وللثالث: 6−(−4)=10 و1−6=−5.

أعطى np.ediff1d(A) القائمة [3,-10,13,-8,6,-13,10,-5] بالشكل (8,). تحققنا أن ترتيب المدخل في مرجعنا المسطح هو [5,8,-2,11,3,9,-4,6,1]، صفًا بعد صف.

بين −2 آخر الصف الأول و11 أول الثاني يوجد فرق 11−(−2)=13. وبين 9 آخر الصف الثاني و−4 أول الثالث يوجد فرق −4−9=−13. موضعاهما في قائمة الفروق، بفهرسة تبدأ من صفر، هما 2 و5.

إزالة هذين الموضعين من قائمة المثال تترك [3,-10,-8,6,10,-5]؛ هذه فروق الصفوف الداخلية بالترتيب نفسه. لم نزل موضعين بناء على كون القيم كبيرة، بل بناء على خريطة أزواج المصدر.

لجدول من m صفوف وn أعمدة، بأطوال موجبة في نموذجنا، هناك m(n−1) زوجًا داخل الصفوف. وصل نهايات الصفوف ببدايات التالية يضيف m−1 زوجًا، فيصبح المجموع mn−1. في A: 3×2+2=8.

نجمع الداخلية: (3−10)+(−8+6)+(10−5)=−7−2+5=−4. ونجمع الإضافيتين: 13−13=0. لذلك مجموع الفروق الثمانية −4 أيضًا، ويساوي في المثال آخر المسار 1 ناقص أوله 5.

تساوي المجموعين لا يجعل القائمتين متساويتين: إحداهما ثماني قيم والأخرى ست، والزوجان الإضافيان غير صفريين. فقدنا ظهورهما عند اختزال النتيجة إلى مجموع واحد؛ نراجع الأزواج إلى جانب العدد الإجمالي.

تغيير مستوى صف يغير فرق الحد

للتحكم، أنشأنا B=[[2,2,2],[7,7,7],[-3,-3,-3]] من int64، بالشكل (3,3). أعطى diff(B,axis=1) صفوفًا من صفرين لكل صف؛ لا تغير داخل أي صف من هذا الجدول.

لكن ediff1d(B) أعطت [0,0,5,0,0,-10,0,0]. الانتقال الأول بين الصفوف هو 7−2=5، والثاني −3−7=−10. لا نقرأ هذين الفرقين بوصفهما تغيرًا داخل أحد الصفوف.

رجعنا إلى A وأضفنا صفرًا لكل عنصر في صفها الأول، و20 لكل عنصر في الثاني، و−7 لكل عنصر في الثالث. أصبح الجدول [[5,8,-2],[31,23,29],[-11,-1,-6]]. هذه إزاحات مؤلفة للمراجعة.

بقي diff على axis=1 كما كان: [[3,-10],[-8,6],[10,-5]]. داخل الصف نفسه تلغى الإضافة المشتركة في الطرح: (التالي+c)−(السابق+c)=التالي−السابق.

أما فرق أول الثاني ناقص آخر الأول فأصبح 31−(−2)=33. وفرق أول الثالث ناقص آخر الثاني أصبح −11−29=−40. أعطت ediff1d للجدول المعدل [3,-10,33,-8,6,-40,10,-5].

في حسابنا، إذا كانت إزاحة الصف r هي c_r، يتغير فرق الحد إلى الفرق الأصلي+c_(r+1)−c_r. لذلك 13+20−0=33، و−13−7−20=−40. لا توجد إضافة مشتركة واحدة تلغى بين هذين الصفين.

نربط كل فرق بزوج المصدر الذي أنتجه. إذا كان هدف جدول فعلي مقارنة عناصر داخل كل صف، فعبور الصفوف يحتاج مبررًا مستقلًا من معنى البيانات؛ المثال المؤلف لا يقدم هذا المبرر.

مجموع متفق وحدود تتغير بإزاحات الصفوف.
تتلاشى الحدود في المجموع الأصلي؛ الإزاحات تغيرها.

مرجع الجيران ونطاق الفحوص

بنى مرجع Python متجهًا من قوائم الصفوف، ثم طرح كل جار من التالي. وبنى مرجعًا آخر للفروق الداخلية بحلقة مستقلة على كل صف، وجمع فروق الحدود من أول الصف التالي وآخر الحالي. لا يستدعي مرجع التوقع ediff1d أو diff.

حسبنا مواضع الحدود في قائمة الفروق على صورة (r+1)n−1، لصفوف r من صفر إلى m−2. قارنا القيم عند هذه المواضع بفروق الحدود المؤلفة، وباقي القيم بفروق الصفوف الداخلية، مع الأشكال والأنواع.

في الشبكة استعملنا القيم −2 وصفر و3، مع الأشكال (2,3) و(2,2) و(3,1) و(1,3). أعداد الجداول 3**6 و3**4 و3**3 و3**3، ومجموعها 729+81+27+27=864.

الشكل (3,1) لا يملك زوجًا داخل صف؛ أعطت مقارنة axis=1 الشكل (3,0)، بينما يملك المسار المسطح حدين بين الصفوف. والشكل (1,3) لا يملك حدًا بين صفين؛ تتبقى الفروق الداخلية وحدها. تدخل هذه الحالات ضمن الفحوص المعلنة.

لكل حالة ستة فحوص: قيم ediff1d وشكلها ونوعها؛ قيم diff الداخلي وشكله ونوعه؛ تقسيم المواضع إلى داخلية وحدودية؛ تعداد الأزواج؛ إلغاء الحدود في المجموع؛ وثبات بايتات المصدر وشكله.

أضفنا التحكمين المباشرين A وB إلى الشبكة، وثلاثة فحوص للجدول ذي إزاحات الصفوف: ثبات الداخلية؛ تغير الحدود بالصيغة المستقلة؛ والقائمة المعدلة كاملة. المجموع (864+2)×6+3=5199، ومرت جميعها.

النطاق جداول int64 محدودة بأحجام موجبة، وediff1d دون حشو، وdiff للفرق الأول على axis=1. لا يشمل مدخلًا فارغًا أو أنواعًا أخرى أو تجاوز سعة أو أقنعة أو حشوًا أو فروقًا أعلى أو axis=0.

لم نفحص الملكية أو أثر الكتابة في الناتج أو الزمن، ولم نعامل الفروق كمعدلات. الفحص يثبت نتائج الأمثلة والشبكة المحددة؛ تحديد الزوج الصحيح في بيانات أخرى يتطلب معنى صفوفها وأعمدتها.

المسار على Aالشكلالقيم
diff; axis=1(3,2)[[3,-10],[-8,6],[10,-5]]
ediff1d(8,)[3,-10,13,-8,6,-13,10,-5]
حدا الصفوفموضعا2 و513، −13

للتوسع: محور المتوسط وشكل الملخص.

المراجع

  1. NumPy 2.3 — ediff1d
  2. NumPy 2.3 — diff

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.