علوم وفضاء

norm: هل يعد ord=0 خانات المصفوفة؟

المدخل والمحاور.
خطأ وعدان.

ord=0 يعد غير الأصفار للمتجهات؛ ليس خيارًا مدعومًا لمعيار المصفوفة. [1]

الخيار يعتمد على نوع الحساب

ord=0 يعد غير الأصفار للمتجهات؛ ليس خيارًا مدعومًا لمعيار المصفوفة. [1]

رغم اسم الدالة، يذكر التوثيق أن نتائج ord<1 ليست معايير رياضية بالمعنى الدقيق. نستعمل ord=0 هنا بوصفه عدًا. [1]

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

مصفوفة كاملة أم متجهات على محور؟

axis بعدد صحيح يختار حساب المتجهات؛ زوج محورين يختار حساب المصفوفات. [1]

في مثالنا A من نوع int64 وشكل (2,3)، يطلق norm(A,ord=0) ونسخة axis=(0,1) خطأ ValueError على NumPy 2.3.5.

نختبر كل استدعاء يطلق خطأً منفردًا، حتى لا يمنع الخطأ الأول قراءة نتيجة الثاني.

import numpy as np A=np.array([[0,3,0],[4,0,5]],dtype=np.int64) np.linalg.norm(A,ord=0) # ValueError np.linalg.norm(A,ord=0,axis=(0,1)) # ValueError

مع axis=None، المدخل ثنائي البعد يعامل في مسار المصفوفة؛ المدخل أحادي البعد يعامل في مسار المتجه. [1]

A تضم ثلاث خانات عددية غير صفرية: 3 و4 و5. رفض الاستدعاء الأول لا يثبت أن هذا العدد غير معروف أو أن عناصر A غير صالحة؛ هو اختلاف عن تشغيل المسارات التي نعرضها لاحقًا. في هذا المثال لم نغير الأرقام لإكمال العد.

نقرأ النتائج مع الشكل

محور 1 يعطي [1,2] ومحور 0 يعطي [1,1,1]؛ تحويل المثال إلى متجه بطول 6 يعطي 3.0. count_nonzero(A) يعطي 3 بنوع int64 في التشغيل.

rows=np.linalg.norm(A,ord=0,axis=1) cols=np.linalg.norm(A,ord=0,axis=0) v=A.reshape(6) flat=np.linalg.norm(v,ord=0) count=np.count_nonzero(A)

نحسب المرجع مستقلًا: الصف الأول يحمل 3 وحدها، فيعد 1؛ الثاني يحمل 4 و5، فيعد 2. كل عمود يحمل قيمة غير صفرية واحدة. مجموع عد الصفوف 1+2=3، ومجموع عد الأعمدة 1+1+1=3.

المخرجان rows وcols من float64، بالشكلين (2,) و(3,). flat عدد float64 بقيمة 3.0، وcount قيمة int64 بقيمة 3 في هذا التشغيل. القيمة العددية متفقة، لكن لا نساوي الأنواع لمجرد ذلك.

count_nonzero يعد القيم غير الصفرية، والافتراضي يعطي العدد الكلي. [2]

لا نستخدم هذه المجاميع لتحديد مواضع الخانات. نحتفظ بـA ونتيجة كل استدعاء؛ موضوعنا صلاحية ord=0 بحسب المسار، لا استعادة البيانات من العد.

الصف الواحد والمتجه.
قيم واحدة وأشكال مختلفة.

الصف الواحد ليس متجهًا أحادي البعد

تحكم: الصف الواحد C من الشكل (1,6) يظل يرفض ord=0 دون محور؛ محور 1 يعطي [3]، والمتجه ذو الشكل (6,) يعطي 3.0.

C=np.array([[0,3,0,4,0,5]],dtype=np.int64) np.linalg.norm(C,ord=0) # ValueError np.linalg.norm(C,ord=0,axis=1) np.linalg.norm(C.reshape(6),ord=0)

رتبنا قيم المثال في صف واحد. لا يحمل الشكل (1,6) عدد الأبعاد نفسه الذي يحمله (6,). في التحكم الأول بقي الاستدعاء في مسار المصفوفة ورفض الخيار؛ الاستدعاء على محور واحد أعطى مصفوفة float64 من عنصر واحد قيمته 3.0.

نحدد أولًا هل نريد عدًا كليًا أم عدًا لكل صف أو عمود، ثم نختار مسارًا موثقًا لذلك. لعد كلي نستخدم count_nonzero هنا؛ عدم تحديد محور له لا يعيد مشكلة ord=0 الخاصة بمسار المصفوفات. [2]

فحصنا 729 توزيعًا من −2 و0 و4 في ست خانات بالشكل (2,3)، مع المثال والتحكم. المرجع يعد القيم بمسح إحداثيات Python ولا يستدعي اختزال NumPy. مرت 5844 مقارنة للنتائج والأنواع والأشكال وأصناف الأخطاء وثبات المدخلات.

النطاق int64 وأعداد صغيرة على NumPy 2.3.5 وCPython 3.12.14. لم نفحص نصوصًا أو كائنات أو قيمًا مركبة أو NaN، ولا keepdims أو رتب ord أخرى أو أداءً أو ملكية ذاكرة.

المدخل والمسارالنتيجةالشكل
A دون محورValueErrorA:(2,3)
A ومحور 1[1,2](2,)
A ومحور 0[1,1,1](3,)
المتجه v3.0()
C دون محورValueErrorC:(1,6)
C ومحور 1[3](1,)

للتوسع: أنواع المصفوفات.

المراجع

  1. NumPy norm
  2. NumPy count_nonzero

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