اذهب إلى المحتوى

السؤال

نشر

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

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

np.nan in arr

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

np.nan != np.nan # True

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

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

Recommended Posts

  • 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
  • 0
نشر

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

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

     

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

    numpy.any(numpy.isnan(a))

     

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...