Python’s y Numpy’s nan y set

Me encontré con un comportamiento impredecible con Python‘s Numpy, set y NaN (no es un número):

>>> set([np.float64('nan'), np.float64('nan')]) set([nan, nan]) >>> set([np.float32('nan'), np.float32('nan')]) set([nan, nan]) >>> set([np.float('nan'), np.float('nan')]) set([nan, nan]) >>> set([np.nan, np.nan]) set([nan]) >>> set([float('nan'), float('nan')]) set([nan, nan]) 

Aquí np.nan produce un único conjunto de elementos, mientras que los nans de Numpy producen múltiples nans en un conjunto. ¡Así que flota (‘nan’)! Y tenga en cuenta que:

 >>> type(float('nan')) == type(np.nan) True 

Me pregunto cómo se produce esta diferencia y qué es la racionalidad detrás de los diferentes comportamientos.

Una de las propiedades de NAN es que NAN! = NAN, a diferencia de todos los demás números. Sin embargo, la implementación de set primero comprueba si id (x) coincide con el miembro existente en un índice hash antes de que intente insertar uno nuevo. Si tiene dos objetos con identificaciones diferentes que tienen el valor NAN, obtendrá dos entradas en el conjunto. Si ambos tienen la misma identificación, se colapsan en una sola entrada.

Como han señalado otros, np.nan es un objeto único que siempre tendrá la misma ID.