Fahmy Mostafa نشر 23 يونيو 2021 أرسل تقرير نشر 23 يونيو 2021 لدي مصفوفة تحتوي على عدد من الأعمدة والصفوف كالتالي: 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 لتكون سريعة بما فيه الكفاية 1 اقتباس
0 عبدالله عبدالرحمن11 نشر 23 يونيو 2021 أرسل تقرير نشر 23 يونيو 2021 إعتباراً من NumPy إصدار 1.13 ، يمكنك ببساطة اختيار المحور من أجل تحديد القيم الفريدة في أي مصفوفة N-dim. للحصول على الصفوف الفريدة يمكنك فعل هذا unique_rows = np.unique(original_array, axis=0) اقتباس
1 ريم المهدي نشر 23 يونيو 2021 أرسل تقرير نشر 23 يونيو 2021 يمكن إيجاد الصفوف الفريدة بأكثر من طريقة، منها بإستخدام 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 يمكنك مراجعة الصورة التالية أيضاً: والتي توضح إختلاف سرعات التنفيذ للدوال المستخدمة في إيجاد الصفوف الفريدة، يمكنك مراجعة موقع GitHub لتتعرف على المزيد من التفاصيل. 1 اقتباس
السؤال
Fahmy Mostafa
لدي مصفوفة تحتوي على عدد من الأعمدة والصفوف كالتالي:
لاحظ أن أول صفين فقط يتم تكرارهما أكثر من مرة
كيف يمكنني الحصول على الصفوف الفريدة بدون هاته الصفوف المكررة، لتكون النتيجة كالتالي:
أريد أن أقوم بهذه العملية في مكتبة numpy لتكون سريعة بما فيه الكفاية
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.