• 0

التحقق من وجود قيمة NaN في مصفوفة Numpy

أنا أبحث عن أسرع طريقة للتحقق من وجود NaN (np.nan) في مصفوفة NumPy ، لكن إستعمال دالة isnan غير وارد ، لأنها تنشئ مصفوفة منطقية boolean من الشكل arr.shape ، والتي من المحتمل أن تكون عملاقة (حسب حجم المصفوفة arr).

لقد جربت np.nan كالتالي:

np.nan in arr

لكن يبدو أن هذه الطريقة لا تعمل لأن:

np.nan != np.nan # True

لا أفهم لماذا الشرط السابق يتحقق True، لكن يبدو أن إستعمال np.nan غير وارد بسبب الشرط السابق.

هل هناك طريقة سريعة وفعالة للقيام بذلك في Numpy؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 3

من خلال np.isnan يمكنك معرفة ذلك، كل شيئ موضح في الكود التالي:

import numpy as np
a=np.array([[ 1. , 2.],[ 3. ,np.nan]])
a
"""
array([[ 1.,  2.],
       [ 3., nan]])
"""
# isnan
#nan في مكان تواجد قيمة  true هذا التابع يرد مصفوفة بوليانية بحيث تضع 
np.isnan(a)
"""
array([[False, False],
       [False,  True]])
"""
#وبالتالي  nan أصغر قيمة هي دوماً 
np.min(a) #nan ترد 
np.isnan(np.min(a)) # True
#لجمع عناصر مصفوفة تحوي قيم غير معرفة سيعطي نتيجة غير معرفة sum استخدام 
np.sum(a) # nan
# وبالتالي
np.isnan(np.sum(a)) # True

ومن ناحية الأداء فاستخدام sum أفضل:

a = np.random.rand(100000)
%timeit np.isnan(np.min(a))
"""
10000 loops, best of 3: 153 us per loop
"""
%timeit np.isnan(np.sum(a))
"""
10000 loops, best of 3: 95.9 us per loop
"""
# سأضع قيمة نان  لإحدى الخلايا
a[2000] = np.nan
%timeit np.isnan(np.min(a))
"""
1000 loops, best of 3: 239 us per loop
"""
%timeit np.isnan(np.sum(a))
"""
10000 loops, best of 3: 95.8 us per loop
"""
a[0] = np.nan
%timeit np.isnan(np.min(a))
"""
1000 loops, best of 3: 326 us per loop
"""
%timeit np.isnan(np.sum(a))
"""
10000 loops, best of 3: 95.9 us per loop
"""

نلاحظ أن min يكون أبطأ في وجود NaN أما  في غيابها أسرع. أيضا يصبح أبطأ مع اقتراب NaN من بداية المصفوفة. من ناحية أخرى ،  sum تبدو ثابتة بغض النظر عما إذا كانت هناك NaNs أو لا.

تمّ تعديل بواسطة Ali Haidar Ahmad
3 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكنك استخدام np.isnan كما في التعليق السابق مع استخدام sum  أو min ولكن أيضاً يمكنك استخدام

  • Dot
    numpy.isnan(numpy.dot(a, a))

     

  • كما يمكنك استخدام any

    numpy.any(numpy.isnan(a))

     

يعتبر استخدام dot الأسرع من بين الدوال السابقة 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن