Numpy.unique generates a list unique in what respect?

If you enter an array with shared objects in numpy.unique , the result will be unique based on what?

I tried:

 import numpy as np class A(object): #probably exists a nice mixin for this :P def __init__(self, a): self.a = a def __lt__(self, other): return self.a < other.a def __le__(self, other): return self.a <= other.a def __eq__(self, other): return self.a == other.a def __ge__(self, other): return self.a >= other.a def __gt__(self, other): return self.a > other.a def __ne__(self, other): return self.a != other.a def __repr__(self): return "A({})".format(self.a) def __str__(self): return self.__repr__() np.unique(map(A, range(3)+range(3))) 

which returns

 array([A(0), A(0), A(1), A(1), A(2), A(2)], dtype=object) 

but my intentions are as follows:

 array([A(0), A(1), A(2)], dtype=object) 
+3
source share
1 answer

Assuming the duplicate A(2) is a typo, I just need to define __hash__ (see docs ):

 import numpy as np from functools import total_ordering @total_ordering class A(object): def __init__(self, a): self.a = a def __lt__(self, other): return self.a < other.a def __eq__(self, other): return self.a == other.a def __ne__(self, other): return self.a != other.a def __hash__(self): return hash(self.a) def __repr__(self): return "A({})".format(self.a) def __str__(self): return repr(self) 

produces

 >>> map(A, range(3)+range(3)) [A(0), A(1), A(2), A(0), A(1), A(2)] >>> set(map(A, range(3)+range(3))) set([A(0), A(1), A(2)]) >>> np.unique(map(A, range(3)+range(3))) array([A(0), A(1), A(2)], dtype=object) 

where I used total_ordering to reduce the distribution of methods, as you suggested, it was possible .: ^)

[Edited after publication to fix missing __ne__ .]

+4
source

Source: https://habr.com/ru/post/1479373/


All Articles