numpy.unique ให้เอาต์พุตที่ไม่ถูกต้องสำหรับรายการชุด


14

ฉันมีรายการชุดที่กำหนดโดย

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

เมื่อฉันค้นหาองค์ประกอบเฉพาะในรายการนี้โดยใช้ numpy ของ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._unique1dฟังก์ชั่นจาก NumPy (ดูรหัสที่นี่ ) ซึ่งตัวเองใช้.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

นั่นเป็นเพราะชุดเป็นประเภท unhashable

{1} is {1} # will give False

คุณสามารถใช้ python collections.Counterถ้าคุณสามารถแปลงชุดเป็น tuple เช่นด้านล่าง

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

isการทดสอบไม่เกี่ยวข้องกับการแฮช การขาดความสามารถในการแฮชไม่ได้เป็นเหตุผลที่ np.unique () ไม่ทำงานเป็นชุด: ตามคำตอบที่ยอมรับการขาดการสั่งซื้อทั้งหมดเป็นเหตุผลนั้น การใช้ tuple () กับชุดไม่รับประกันการเรียงลำดับผลลัพธ์ดังนั้นสองชุดที่มีองค์ประกอบเดียวกันอาจได้รับการแปลงเป็นทูเปิลที่แตกต่างกันอย่างไม่ถูกต้อง
Marius Gedminas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.