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

السؤال

نشر

 

أعلم أن هناك دالة لقائمة بايثون List لإرجاع الفهرس الأول لشيء ما:

>>> lst = [1, 2, 3]
>>> lst.index(2)
1

 

هل هناك شيء مشابهة لهذه الدالة في مصفوفات NumPy؟

حاولت أن استعمل التالي:

numpy.index(2)

لكن يظهر لي خطأ بعد وجود مثل هذه الدالة:

AttributeError: module 'numpy' has no attribute 'index'

 

Recommended Posts

  • 1
نشر

إن مصفوفة numpy لا تملك الطريقة index لأنها خاصة بالقوائم list، بل لنبحث عن العناصر التي تحقق شرطاً ضمن مصفوفة numpy علينا استخدام الطريقة where;

# نفرض أن لدينا مصفوفة عشوائية
v = np.random.randn(10)
print(v)
# نطبيق دوال البحث عن أكبر و أصغر عنصر فيها كمثال
maximum = np.max(v)
minimum = np.min(v)
print(maximum, minimum)

# where للبحث عن دليل العناصر التي تساوي أحد القيم الموضوعة في الشرط نستخدم 
index_of_maximum = np.where(v == maximum)
index_of_minimum = np.where(v == minimum)

أصبح لدينا مصفوفتين نحويان دلائل indexes لكل من العناصر التي تساوي أكبر و أصغر قيمة

 

  • 0
نشر

لإيجاد الفهرس الخاص بقيمة معينه في numpy:

نستطيع استخدام الدلة:

numpy.where(boolArr)

نستطيع أن نضع boolArr بالشرط الذي نريد تحقيقه، ففي المثال التالي نبحث عن الفهرس الخاص بالقيمة 15، ويقوم بارجاع list فيها كل الفهرس الخاص بكل مرة ظهرت فيها القيمة 15، ولايجاد أول مره كل ما عليك هو أختيار أول عنصر في الlist التي بها الفهرس:

import numpy as np
# أنشاء list بها عدة ارقام
arr = np.array([11, 12, 13, 14, 15, 16, 17, 15, 11, 12, 14, 15, 16, 17])

# نطبع كل الفهرس الخاص بالرقم 15
result = np.where(arr == 15)
print('Tuple of arrays returned : ', result)
print("Elements with value 15 exists at following indices", result[0], sep='\n')

ويكون الخرج كالتالي:

Tuple of arrays returned :  (array([ 4,  7, 11], dtype=int32),)
Elements with value 15 exists at following indices
[ 4  7 11]

ولاختيار أول مره تظهر ظهر فيها الرقم 15:

x_index = result[0]

 

  • 0
نشر

يمكنك استخدام الدالة nonzero كالتالي

>>> t = array([1, 1, 1, 2, 2, 3, 8, 3, 8, 8])
>>> nonzero(t == 8) #لاحظ الشرط الموجود هنا
(array([6, 8, 9]),)#للرقم 8 indexes ستجد هنا وجود جميع ال 
>>> nonzero(t == 8)[0][0] #index للوصول لأول 
6

كما يمكنك استخدام حل بسيط مثل تحويل المصفوفة ل list ثم التحقق من العنصر 

l = [1,2,3,4,5] # Python list
a = numpy.array(l) # NumPy إنشاء مصفوفة 
i = a.tolist().index(2) #ثم البحث عن الرقم 2 list تحويل المصفوفة ل
print i

 

  • 1
نشر (معدل)

ترجع الدالة l.index(x) فهرس i بحيث i هو يمثل أول فهرس ظهرت فيه x في القائمة.. وبالتالي يمكننا أن نفترض وبشكل آمان أن دالة index () في Python يتم تنفيذها بحيث تتوقف بعد العثور على المطابقة الأولى،  وهذا يؤدي إلى تحسين الأداء (تحسين زمن التنفيذ، حيث أنها تتوقف بعد عثورها على العنصر مباشرة بدل أن تكمل بدون فائدة).للعثور على عنصر يتوقف بعد التطابق الأول في مصفوفة NumPy ، استخدم المكرر ndenumerate:

a = np.arange(10)
a
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
next((idx for idx, val in np.ndenumerate(a) if val==3))
# 3

هناك وظائف أخرى في NumPy (argmax و where و nonzero) يمكن استخدامها للعثور على عنصر في مصفوفة، لكن جميعها لها عيب في المرور عبر المصفوفة بأكملها بحثاً عن جميع حالات التطابق، ولم يتم تحسينها للعثور على العنصر الأول فقط أي أول تطابق. لاحظ أيضاً أن where و nonzero يرجعان المصفوفات ، لذلك تحتاج إلى تحديد العنصر الأول للحصول على الفهرس. لاحظ المثال التالي:

a = np.arange(10)
a=np.array([0, 11, 2, 3, 4, 5, 6, 7, 8, 9])
np.argmax(a==11) # 1
np.where(a==11) # (array([1], dtype=int64),)
np.nonzero(a==11) # (array([1], dtype=int64),)
# وبالتالي يجب أن نكتب
np.nonzero(a == 11)[0][0] # 1
np.where(a==11) [0][0]# 1

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

تم التعديل في بواسطة Ali Haidar Ahmad

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...