2013-05-06 2 views
4

Этот вопрос связан с (но не такой же, как) "numpy.unique generates a list unique in what regard?"numpy.unique действует странно с numpy.array объектов

The установки:

import numpy as np 
from functools import total_ordering 

@total_ordering 
class UniqueObject(object): 
    def __init__(self, a): 
     self.a = a 
    def __eq__(self, other): 
     return self.a == other.a 
    def __lt__(self, other): 
     return self.a < other.a 
    def __hash__(self): 
     return hash(self.a) 
    def __str__(self): 
     return "UniqueObject({})".format(self.a) 
    def __repr__(self): 
     return self.__str__() 

Ожидаемое поведение np.unique:

>>> np.unique([1, 1, 2, 2]) 
array([1, 2]) 
>>> np.unique(np.array([1, 1, 2, 2])) 
array([1, 2]) 
>>> np.unique(map(UniqueObject, [1, 1, 2, 2])) 
array([UniqueObject(1), UniqueObject(2)], dtype=object) 

Это не проблема, это работает. Но это не работает, как ожидалось:

>>> np.unique(np.array(map(UniqueObject, [1, 1, 2, 2]))) 
array([UniqueObject(1), UniqueObject(1), UniqueObject(2), UniqueObject(2)], dtype=object) 

Каким np.array с DTYPE = объект обрабатывается иначе, чем список питона с объектами?

То есть:

objs = map(UniqueObject, [1, 1, 2, 2]) 
np.unique(objs) != np.unique(np.array(objs)) #? 

Я бегу numpy 1.8.0.dev-74b08b3 и Python 2.7.3

ответ

3

После через источник np.unique, кажется, что отрасль, которая на самом деле принято является

else: 
    ar.sort() 
    flag = np.concatenate(([True], ar[1:] != ar[:-1])) 
    return ar[flag] 

который просто сортирует члены, а затем берет те, которые не равны предыдущему. Но разве это не должно работать? .. упс. Это на мне. Ваш исходный код определен __ne__, и я случайно удалил его, удалив сравнения total_ordering -ed.

>>> UniqueObject(1) == UniqueObject(1) 
True 
>>> UniqueObject(1) != UniqueObject(1) 
True 

Ввод __ne__ назад в:

>>> UniqueObject(1) != UniqueObject(1) 
False 
>>> np.array(map(UniqueObject, [1,1,2,2])) 
array([UniqueObject(1), UniqueObject(1), UniqueObject(2), UniqueObject(2)], dtype=object) 
>>> np.unique(np.array(map(UniqueObject, [1,1,2,2]))) 
array([UniqueObject(1), UniqueObject(2)], dtype=object) 
Смежные вопросы