numpy.unique সেটগুলির তালিকার জন্য ভুল আউটপুট দেয়


14

আমার দেওয়া সেটগুলির একটি তালিকা আছে,

sets1 = [{1},{2},{1}]

আমি যখন নম্পি ব্যবহার করে এই তালিকার অনন্য উপাদানগুলি পাই unique, তখন আমি পাই

np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)

দেখা যায়, ফলাফল {1}আউটপুট বার বার হিসাবে ভুল হয় ।

আমি যখন অনুরূপ উপাদানগুলি সংলগ্ন করে ইনপুটটিতে ক্রম পরিবর্তন করি তখন এটি ঘটে না।

sets2 = [{1},{1},{2}]

np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)

কেন এমন হয়? নাকি আমি যেভাবে করেছি তাতে কিছু ভুল আছে?


1
কেন এটি কাজ করে না তা আমি নিশ্চিত নই, তবে আমার সন্দেহ হয় যে sets1.sort()এটি তালিকার ক্রম পরিবর্তন করে না এমন ঘটনার সাথে এটি করা উচিত । আমি তোমাদের একটি ফাংশন তৈরি করতে হবে মনে fযাই হোক না কেন মানদণ্ড যদি আপনি চান উপর ভিত্তি করে সেট বাছাই করতে, এবং তারপর পাস sets1.sort(key=f)করারnp.unique()
ATK7474

উত্তর:


8

এখানে যা ঘটে তা হ'ল ফাংশনটি NumPy থেকে ফাংশনের np.uniqueউপর ভিত্তি করে np._unique1d( এখানে কোডটি দেখুন ), যা নিজেই .sort()পদ্ধতিটি ব্যবহার করে ।

এখন, প্রতিটি সেটে কেবল একটি সংখ্যক পূর্ণ সংখ্যক সেটগুলির তালিকা সাজানোর ফলে সেটে উপস্থিত পূর্ণসংখ্যার মান অনুসারে প্রতিটি সেট সহ একটি তালিকা তৈরি হবে না । সুতরাং আমাদের থাকবে (এবং এটি আমরা চাই না):

sets = [{1},{2},{1}]
sets.sort()
print(sets)

# > [{1},{2},{1}]
# ie. the list has not been "sorted" like we want it to

এখন, আপনি যেমনটি উল্লেখ করেছেন, সেটগুলির তালিকা যদি আপনার ইচ্ছেমতো ইতিমধ্যে অর্ডার করা হয় তবে np.uniqueকাজ করবে (যেহেতু আপনি তালিকাটি আগেই সাজিয়ে রেখেছিলেন)।

একটি নির্দিষ্ট সমাধান (যদিও, দয়া করে সচেতন হন যে এটি কেবলমাত্র একটি সেট সংখ্যার তালিকার জন্য কাজ করবে যে প্রতিটিতে একটি একক পূর্ণসংখ্যার সমন্বয় রয়েছে) তবে তা হ'ল:

np.unique(sorted(sets, key=lambda x: next(iter(x))))

-1

সেটি হ'ল সেটটি অপরিহার্য ধরণের

{1} is {1} # will give False

আপনি collections.Counterসেটটিকে নীচের মত টুপলে রূপান্তর করতে পারলে পাইথন ব্যবহার করতে পারেন

from collections import Counter
sets1 = [{1},{2},{1}]
Counter([tuple(a) for a in sets1])

isপরীক্ষা হ্যাশাবিলিটির সাথে সম্পর্কিত নয়। হ্যাশাবিলিটির অভাবটি এনপিউইনিক () সেটগুলিতে কাজ না করার কারণ নয়: গৃহীত উত্তর অনুসারে, মোট অর্ডিংয়ের অভাব সেই কারণ। সেটগুলিতে টিপল () ব্যবহার আউটপুট ক্রমের গ্যারান্টি দেয় না, সুতরাং একই উপাদানগুলির সাথে দুটি সেট ভুলভাবে বিভিন্ন টিউপলে রূপান্তরিত হতে পারে।
মারিউস গেডমিনাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.