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

السؤال

نشر

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

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

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

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

 

Recommended Posts

  • 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.])

 

  • 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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...