• 0

إزالة قيم nan من مصفوفة Numpy

أريد معرفة كيفية إزالة قيم nan من المصفوفة التالية. تبدو المصفوفة الخاصة بي على هذا النحو:

array([1400., 1500., 1600.,   nan,   nan,   nan, 1700.])

كيف يمكنني إزالة قيم nan من هذه المصفوفة لتصبح النتيجة بالشكل التالي:

array([1400., 1500., 1600., 1700.])

 

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

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


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

الطريقة الأولى هي استخدام ()numpy.nan و  ()numpy.logical_not. فلتكن لدينا المصفوفة التالية:

a = numpy.array([2, 8, numpy.nan, 3, 1, numpy.nan])

ولو طبقنا عليها numpy.isnan سوف يعيد لنا نفس المصفوفة لكن بقيم بوليانية بحيث يضع true مكان القيم التي ليست nan و false مكان القيم nan:

print(numpy.isnan(a)) 
# [False False  True False False  True]

الآن لو استخدمنا على الناتج السابق التابع logical_not فسوف يعكس النتائج، أي بدل true سيضع false والعكس:

print(numpy.logical_not(numpy.isnan(a))) 
# [ True  True False  True  True False]

الآن يمكننا الاستفادة من الفكرة التالية:

e=(np.array([1, 0, 3,4]))
e[[True, True, True,False]]
# array([1, 0, 3])

لذا يكون  الحل كالتالي:

import numpy
# إنشاؤ المصفوفة
a = numpy.array([2, 8, numpy.nan, 3, 1, numpy.nan])
#numpy.logical_not و numpy.isnan(): باستخدام 
#nan سنقوم بحذف قيم
print(numpy.isnan(a)) # [False False  True False False  True]
print(numpy.logical_not(numpy.isnan(a))) # [ True  True False  True  True False]
b = a[numpy.logical_not(numpy.isnan(a))] 
print(b) # [2. 8. 3. 1.]

مثال آخر على مصفوفة ثنائية:

import numpy
# إنشاؤ المصفوفة
a = numpy.array([[6, 2, numpy.nan], [2, 6, 1],
				[numpy.nan, 1, numpy.nan]])
#numpy.logical_not و numpy.isnan(): باستخدام 
#nan سنقوم بحذف قيم
print(numpy.isnan(a))
"""
[[False False  True]
 [False False False]
 [ True False  True]]
"""
print(numpy.logical_not(numpy.isnan(a)))
"""
[[ True  True False]
 [ True  True  True]
 [False  True False]]
"""
b = a[numpy.logical_not(numpy.isnan(a))] 
print(b) # [6. 2. 2. 6. 1. 1.]

أو يمكنك استخدام المعامل ~ بدلاً من logical كالتالي:

import numpy
a = numpy.array([[12, 5, numpy.nan, 7],
				[2, 61, 1, numpy.nan],
				[numpy.nan, 1,
				numpy.nan, 5]])
a = a[~(numpy.isnan(c))]
a
#array([12.,  5.,  7.,  2., 61.,  1.,  1.,  5.])

أو من خلال التابع isfinite في نمباي (بنفس المبدأ) :

import numpy
a = numpy.array([[12, 5, numpy.nan, 7],
				[2, 61, 1, numpy.nan],
				[numpy.nan, 1,
				numpy.nan, 5]])
a[np.isfinite(a)]
# array([12.,  5.,  7.,  2., 61.,  1.,  1.,  5.])

 

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

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


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

إذا كنت تستخدم numpy لمصفوفاتك ، فيمكنك أيضًا استخدام

x = x[numpy.logical_not(numpy.isnan(x))]

وبشكلٍ مختصر كالآتي

x = x[~numpy.isnan(x)]

توضيح

تقوم الدالة الداخلية numpy.isnan بإرجاع مصفوفة Boolean أو مصفوفة منطقية بالقيمة صائب True لكل x لا يكون رقماً.

ويما أننا نريد عكس ذلك  ، فنستخدم المعامل المنطقي للنفي ( ~ ) للحصول على مصفوفة مع قيم صائبة True في كل مكان يكون x رقم ، عكس سابقاً.

أخيرًا ، نستخدم هذه المصفوفة المنطقية للفهرسة في المصفوفة الأصلية x ، لاسترداد القيم غير NaN فقط.

تعتبر هذه الطريقة الأكثر استخداما ولكن يمكنك استخدام العديد من الطرق الأخرى مثل استخدام دالة filter كالآتي

filter(lambda v: v==v, x)

حيث أنها تعمل للقوائم lists وايضاً مصفوفة numpy حيث v!=v تكون فقط لNan.

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


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

يمكننا أن نقوم بازالتها بسهولة باستخدام بعض العمليات المنطاقة.

تستخدم الدالة isnan لتقوم بفحص كل عنصر في المصفوفة اذا كان قيمته nan ام لا، وتقوم بارجاع قيمه True او False كناتج بحث لكل عنصر حيث تعني True ان قيمه العنصر nan.

لذا اذا كنا نريد ازالة العناصر التي قيمتها nan ، يجب أن نقوم بعكس المنطق المستخدم هنا، اي نقوم بعكس كل True الي False حتى نستطيع ازالته، ومن هنا سنستخدم دالة العكس not.

لذا يكون الكود المستخدم كالتالي:

new_array = new_array[numpy.logical_not(numpy.isnan(new_array))]

واذا قمنا بتشغيلة على المصفوفة الخاصة بك تكون النتيجة كالتالي:

array([1400., 1500., 1600., 1700.])

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

 

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


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

بالاعتماد على الجزئية أن NaN لاتساوي NaN أي

v!=v only for NaN

يمكننا عمل فلتر للعناصر بالطريقة التالية:

filter(lambda v: v==v, x)

هذا يعيد العناصر التي تساوي نفسها (أي الأعداد المنتهية)، تعمل على lists + numpy array

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


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

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

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

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


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

تسجيل الدخول

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


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