numpy.unique cung cấp đầu ra sai cho danh sách các bộ


14

Tôi có một danh sách các bộ được đưa ra bởi,

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

Khi tôi tìm thấy các yếu tố duy nhất trong danh sách này bằng cách sử dụng numpy unique, tôi nhận được

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

Như có thể thấy, kết quả là sai như {1}được lặp lại trong đầu ra.

Khi tôi thay đổi thứ tự trong đầu vào bằng cách đặt các phần tử tương tự liền kề, điều này không xảy ra.

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

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

Tại sao điều này xảy ra? Hoặc có điều gì đó sai trong cách tôi đã làm?


1
Tôi không chắc tại sao nó không hoạt động, nhưng tôi nghi ngờ nó phải làm với thực tế là sets1.sort()nó không thay đổi thứ tự của danh sách. Tôi nghĩ rằng bạn cần tạo một hàm fđể sắp xếp các bộ dựa trên bất kỳ tiêu chí nào bạn muốn và sau đó chuyển sets1.sort(key=f)đếnnp.unique()
ATK7474

Câu trả lời:


8

Điều xảy ra ở đây là np.uniquehàm dựa trên np._unique1dhàm từ NumPy (xem mã ở đây ), chính nó sử dụng .sort()phương thức.

Bây giờ, việc sắp xếp danh sách các bộ chỉ chứa một số nguyên trong mỗi bộ sẽ không dẫn đến một danh sách với mỗi bộ được sắp xếp theo giá trị của số nguyên có trong bộ. Vì vậy, chúng tôi sẽ có (và đó không phải là những gì chúng tôi muốn):

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

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

Bây giờ, như bạn đã chỉ ra, nếu danh sách các bộ đã được sắp xếp theo cách bạn muốn, np.uniquesẽ hoạt động (vì bạn sẽ sắp xếp danh sách trước).

Một giải pháp cụ thể (tuy nhiên, xin lưu ý rằng nó sẽ chỉ hoạt động cho một danh sách các bộ mà mỗi bộ chứa một số nguyên) sẽ là:

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

-1

Đó là bởi vì tập hợp là loại không thể xóa được

{1} is {1} # will give False

bạn có thể sử dụng python collections.Counternếu bạn có thể chuyển đổi tập hợp thành tuple như bên dưới

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

iskiểm tra không liên quan đến khả năng băm. Thiếu khả năng băm không phải là lý do np.unique () không hoạt động trên các tập hợp: theo câu trả lời được chấp nhận, thiếu tổng số đơn đặt hàng là lý do đó. Sử dụng tuple () trên các bộ không đảm bảo thứ tự đầu ra, vì vậy hai bộ có cùng các phần tử có thể được chuyển đổi thành các bộ dữ liệu khác nhau.
Marius Gedminas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.