في مثالنا، تغيرت الحالة مرتين وكانت نتيجة الفرق الثاني False.
قارن حالتين
تحفظ diff النوع المنطقي: المتجاوران المتساويان يعطيان False والمختلفان True؛ والفروق الأعلى تعيد العملية. [1]
نعرف في هذا الدرس تغيرًا بأنه انتقال بين حالتين مختلفتين في موضعين متجاورين. لا نضع أوقاتًا للمشاهدات أو نحسب معدل تغير في الثانية. السجل هنا قائمة حالات مؤلفة، ونعرف ترتيبها.
عند تطبيق العملية مرتين، تكون مدخلات المرة الثانية نتائج المرة الأولى. نسأل هل علامتا الانتقال متساويتان، بدل جمع عدد العلامات الصحيحة. هذه المقارنة قد تعطي False عندما كانت العلامتان True معًا.
نستعمل True وFalse كاملتين في النص؛ وفي الرسم ترمز T إلى True وF إلى False. نحفظ نوع المصفوفة وشكلها إلى جانب القيم، ولا نفسر False على أنه عدد مرات التغير المسجل.
تغيران أو تغير واحد
أنشأنا x=np.array([True,False,True],dtype=np.bool_). في NumPy 2.3.5 على CPython 3.12.14، أعادت np.diff(x) القيم [True,True] بالنوع bool والشكل (2,). تغيرت الحالة في الانتقالين.
أعادت np.diff(x,n=2) القيم [False] بالنوع bool والشكل (1,). في قائمتنا المرجعية، نقارن True الأولى مع True الثانية: متساويتان، فتكون الإجابة False. لا تختفي حقيقة وجود تغيرين من السجل الأصلي.
أنشأنا التحكم y=np.array([True,False,False],dtype=np.bool_). أعادت np.diff(y) القيم [True,False] بالنوع bool والشكل (2,)؛ الانتقال الأول تغير، والثاني بقي على الحالة False.
أعادت np.diff(y,n=2) القيم [True] بالنوع bool والشكل (1,). علامتا الانتقال مختلفتان، لذلك أعطت المقارنة الثانية True. يوجد تغير واحد في هذا السجل، مقابل تغيرين في السجل الذي أعطى False.
لعد التغيرات في كل ثلاثية، جمعنا بعدّ مستقل في Python علامتَي الاختلاف بين الأولى والثانية وبين الثانية والثالثة. حصلنا على اثنين للمثال وواحد للتحكم. نحتفظ بالعدد في عمود مستقل عن نتيجة الفرق الثاني.
العدد واحد في العد ليس النوع bool، حتى إن بدا الاثنان متوافقين في مثال التحكم. وقد أعطت ثلاثية حالات متساوية عدد تغيرات صفرًا ونتيجة ثانية False في فحوص الشبكة؛ فلا تميز False وحدها بين الصفر والاثنين.
راجع الطرفين
XOR عملية منطقية عنصرية. [2]
نكتب الثلاثية a ثم b ثم c. المرجع الأول يحسب a!=b ثم b!=c؛ والمرجع الثاني يقارن هاتين الإجابتين. وبصورة منفصلة، نقارن a مع c ونعد التغيرات الأصلية. هذه ثلاث طرق للتحقق، لا ادعاء عن تنفيذ NumPy الداخلي.
إذا لم تتغير الحالة، كان الطرفان متساويين والعد صفرًا. وإذا تغيرت مرة واحدة، اختلف الطرفان والعد واحد. وإذا تغيرت مرتين، عادت الحالة الأخيرة إلى الأولى، فتساوى الطرفان وكان العد اثنين. في الحالات الثلاث، النتيجة الثانية توافق فردية العد.
في [True,False,True] عاد الطرف الأخير إلى True، لذلك لا يحدد توافق الطرفين ما حدث في الوسط. نستطيع قراءة False ثانية بوصفها توافق الطرفين في هذا النطاق، لكننا نرجع إلى الثلاثية أو العلامتين الأوليين لمعرفة عدد التغيرات.
أنشأنا أيضًا مصفوفتين int64 مستقلتين من القيم صفر وواحد المقابلة لحالتي المثال. [1,0,1] أعطت فرقًا أول [-1,1] وثانيًا [2]؛ و[1,0,0] أعطت [-1,0] ثم [1]. كانت الأنواع int64 والأشكال (2,) ثم (1,).
هذا تحكم عددي بعملية طرح على صفر وواحد، لا تحويل لنتيجة False القديمة لاستعادة أحداثها. بنى المرجع العددي الفروق بأعداد Python صحيحة من المدخل الأصلي. نحفظ اسم العملية ونوع البيانات حتى لا نسمي المقارنة المنطقية طرحًا بإشارة.

نطاق الفحص
اختبرنا كل سلسلة ممكنة من False وTrue بالأطوال 3 و4 و5 و6. أعدادها 8 و16 و32 و64؛ مجموعها 120 حالة. تشمل هذه الشبكة الثلاثيات الثماني الممكنة، وسلاسل تحتوي أكثر من نافذة ثلاثية.
بنينا الفرق الأول المرجعي بمتباينة حالتين متجاورتين في قائمة Python. وبنينا الثاني بمتباينة إجابتين متجاورتين من المرجع الأول. المرجع لا يستدعي diff أو تحويل نوع من NumPy لبناء التوقع.
لكل نافذة ثلاثية حسبنا مستقلين اختلاف الطرف الأول والأخير، وعد التغيرات بين الحالات الأصلية. ثم قارنا النتيجة الثانية مع اختلاف الطرفين ومع كون باقي قسمة العدد على اثنين يساوي واحدًا.
في كل حالة راجعنا ثمانية أشياء: قيم الفرق المنطقي الأول؛ ونوعه وشكله؛ وقيم الثاني؛ ونوعه وشكله؛ وموافقته اختلاف الطرفين؛ وموافقته فردية عدد التغيرات؛ والفروق الأولى والثانية لتحكم int64؛ وثبات المدخلين وشكلهما.
أضفنا حالتي المثال بالفحوص الثمانية نفسيها، وفحصين خاصين لعدد التغيرات والنتيجة الثانية المعلنة. الحساب 120×8+2×8+2=978، ومرت جميعها. بقيت بايتات مدخلي bool وint64 دون تغيير.
لم نفحص مرتبة فرق أخرى أو محاور متعددة أو طولًا أقل من ثلاثة أو prepend أو append أو أنواعًا أخرى أو الأداء أو ملكية الذاكرة. لم نربط التغيرات بفواصل زمنية، ولم نستنتج سبب حدوثها.
إذا أردت عدد التغيرات، احتفظ بالعلامات الأولى أو بالسجل الأصلي وعد الاختلافات التي عرفتها. أما الفرق الثاني المنطقي في هذا النطاق فيجيب عن اختلاف علامتَي الانتقال؛ الاسم لا يحوله إلى سجل أعداد للأحداث.
| المدخل bool | الفرق الأول | الفرق الثاني | عدد التغيرات |
|---|---|---|---|
| [True,False,True] | [True,True] | [False] | 2 |
| [True,False,False] | [True,False] | [True] | 1 |
للتوسع: غلاف vectorize.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
