Fahmy Mostafa نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 أعلم أن هناك دالة لقائمة بايثون List لإرجاع الفهرس الأول لشيء ما: >>> lst = [1, 2, 3] >>> lst.index(2) 1 هل هناك شيء مشابهة لهذه الدالة في مصفوفات NumPy؟ حاولت أن استعمل التالي: numpy.index(2) لكن يظهر لي خطأ بعد وجود مثل هذه الدالة: AttributeError: module 'numpy' has no attribute 'index' 1 اقتباس
1 Wael Aljamal نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 إن مصفوفة 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 لكل من العناصر التي تساوي أكبر و أصغر قيمة اقتباس
1 Ali Haidar Ahmad نشر 29 يوليو 2021 أرسل تقرير نشر 29 يوليو 2021 (معدل) ترجع الدالة 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 لذا فهذه الطريقة تعتبر أسرع خصوصاً عندما يكون العنصر الذي تبحث عنه موجوداً في بداية المصفوفة. تم التعديل في 29 يوليو 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
0 Ahmed Sharshar نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 لإيجاد الفهرس الخاص بقيمة معينه في 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] 1 اقتباس
0 عبدالباسط ابراهيم نشر 28 يوليو 2021 أرسل تقرير نشر 28 يوليو 2021 يمكنك استخدام الدالة 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 اقتباس
السؤال
Fahmy Mostafa
أعلم أن هناك دالة لقائمة بايثون List لإرجاع الفهرس الأول لشيء ما:
هل هناك شيء مشابهة لهذه الدالة في مصفوفات NumPy؟
حاولت أن استعمل التالي:
لكن يظهر لي خطأ بعد وجود مثل هذه الدالة:
4 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.