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

السؤال

نشر

لدي مصفوفة تحتوي على عدد من الأعمدة والصفوف كالتالي:

array([
       [1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1,0, 0]
])

لاحظ أن أول صفين فقط يتم تكرارهما أكثر من مرة

كيف يمكنني الحصول على الصفوف الفريدة بدون هاته الصفوف المكررة، لتكون النتيجة كالتالي:

array([
       [1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 0, 0]
])

أريد أن أقوم بهذه العملية في مكتبة numpy لتكون سريعة بما فيه الكفاية

Recommended Posts

  • 1
نشر

يمكن إيجاد الصفوف الفريدة بأكثر من طريقة، منها بإستخدام unique كما هو موضح في الإجابة أعلاه، أو بإستخدام الدالة vstack كما في المثال التالي:

import numpy as np
a = np.array([
       [1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 0, 0]])
print(np.vstack({tuple(row) for row in a}))
print(np.vstack(set(map(tuple, a))))

بعد إستدعاء الدالة numpy تم تعريف المصفوفة، و من بعدها الدالة vstack من numpy (التي تحول المدخل إلى مكدس رأسي) و بإستخدام خاصية المجموعة التي تقوم بإختيار القيم غير المكررة فقط من الصفوف الموجودة في المصفوفة a.

أما في السطر الأخير فقد تم عمل نفس الشئ بتحويل الصفوف إلى مدخلات للمجموعة بإستخدام دالة map والتي تحول أي صف إلى tuple أولا و من ثم تنفذ عملية التحويل إلى مجموعة و في الأخير تحويل الناتج إلى مكدس رأسي.

طريقة أخرى لإستخراج الصفوف الفريدة بإستخدام طريقة إقصاء الصفوف المكررة عن طريق الدالة drop_duplicates() والتي تستخدم مع dataframe، راجع البرنامج التالي:

import pandas as pd
pd.DataFrame(a).drop_duplicates().values

والتي نحول فيها المصفوفة إلى dataframe لنتمكن من إستخدام الدالة الخاصة بالإقصاء و من ثم لتحويل الناتج إلى مصفوفة نستدعى الدالة values.

لكن عزيزي @Fahmy Mostafa إن كنت تريد الحصول على أسرع طريقة، يمكنك التأكد بإستخدام العبارة timeit والتي تعطيك الزمن المتوسط (لأسرع 5 نتائج) من تنفيذ الدالة 1000 مرة، و حسب التنفيذ و الشرح الموضح في الموقع بأخر الإجابة vstack تعتبر أسرع طريقة:

timeit np.vstack(set(map(tuple, a)))	#10000 loops, best of 5: 25.1 µs per loop
timeit np.vstack({tuple(row) for row in a})	#10000 loops, best of 5: 24.3 µs per loop
timeit np.unique(a, axis=0)	#10000 loops, best of 5: 107 µs per loop
timeit pd.DataFrame(a).drop_duplicates().values	#1000 loops, best of 5: 1.39 ms per loop

يمكنك مراجعة الصورة التالية أيضاً:

mJuUK.png

 

والتي توضح إختلاف سرعات التنفيذ للدوال المستخدمة في إيجاد الصفوف الفريدة، يمكنك مراجعة موقع GitHub لتتعرف على المزيد من التفاصيل.

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...