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

यहां क्या होता है कि np.uniqueफ़ंक्शन np._unique1dNumPy के फ़ंक्शन पर आधारित है ( यहां कोड देखें ), जो स्वयं .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परीक्षण हैशैबिलिटी से असंबंधित है। हैशबिलिटी का अभाव कारण नहीं है np.unique () सेट पर काम नहीं करता है: स्वीकृत उत्तर के अनुसार, कुल ऑर्डर की कमी का कारण है। सेट पर tuple () का उपयोग करने से आउटपुट ऑर्डर की गारंटी नहीं मिलती है, इसलिए समान तत्वों वाले दो सेट गलत तरीके से अलग-अलग tuples में परिवर्तित हो सकते हैं।
मारियस गेदमिनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.