Jak tttthomasssss
informacji dodatkowej (klasa) type
dla np.float64
i d
są różne. Są różne rodzaje rzeczy:
In [435]: type(np.float64)
Out[435]: type
Rodzaj type
środki (zazwyczaj), że jest to funkcja, dzięki czemu może być używany jako:
In [436]: np.float64(0)
Out[436]: 0.0
In [437]: type(_)
Out[437]: numpy.float64
tworzenia obiektu numerycznej. Właściwie to wygląda bardziej jak definicja klasy. Ale od numpy
używa dużo skompilowanego kodu, a jego ndarray
używa własnego __new__
, nie byłbym zaskoczony, gdyby znalazł się na linii.
In [438]: np.float64.__hash__??
Type: wrapper_descriptor
String Form:<slot wrapper '__hash__' of 'float' objects>
Docstring: x.__hash__() <==> hash(x)
Myślałam ten miałby hash(np.float64)
, ale może to być rzeczywiście hash dla obiektu tego typu, na przykład hash(np.float64(0))
. W takim przypadku hash(np.float64)
po prostu używa domyślnej metody type.__hash__
.
Przechodząc do dtype
:
In [439]: d=np.dtype(np.float64)
In [440]: type(d)
Out[440]: numpy.dtype
d
nie jest funkcją lub klasa:
In [441]: d(0)
...
TypeError: 'numpy.dtype' object is not callable
In [442]: d.__hash__??
Type: method-wrapper
String Form:<method-wrapper '__hash__' of numpy.dtype object at 0xb60f8a60>
Docstring: x.__hash__() <==> hash(x)
Wygląda np.dtype
nie określa żadnej specjalnej metody __hash__
, to po prostu dziedziczy object
.
Dalsze ilustrujący różnicę między float64
i d
, spojrzeć na stosie klasy spadków
In [443]: np.float64.__mro__
Out[443]:
(numpy.float64,
numpy.floating,
numpy.inexact,
numpy.number,
numpy.generic,
float,
object)
In [444]: d.__mro__
...
AttributeError: 'numpy.dtype' object has no attribute '__mro__'
In [445]: np.dtype.__mro__
Out[445]: (numpy.dtype, object)
Więc np.float64
nie definiuje mieszania albo, po prostu dziedziczy float
. d
nie ma wartości __mro__
, ponieważ jest obiektem, a nie klasą.
numpy
ma wystarczająco dużo skompilowanego kodu i długą własną historię, że nie można liczyć na to, że dokumentacja Pythona będzie zawsze stosowana.
np.dtype
i widocznie mają __eq__
np.float64
metod, które pozwolą im być ze sobą porównywane, ale numpy
deweloperom nie wkładać żadnego wysiłku w upewniając się, że metody __hash__
zgodne. Najprawdopodobniej dlatego, że nie muszą używać jako klucza słownika.
Nigdy nie widziałem jak kod:
In [453]: dd={np.float64:12,d:34}
In [454]: dd
Out[454]: {dtype('float64'): 34, numpy.float64: 12}
In [455]: dd[np.float64]
Out[455]: 12
In [456]: dd[d]
Out[456]: 34
Właściwie "typ (d) == typ (np.float64)" to "False". A Python mówi, że tylko "Wartości liczbowe, które są równe, mają tę samą wartość skrótu". – AndyG
Jeśli zamiast tego powiesz 'd = np.float64', to skróty są równoważne. – AndyG
@AndyG Pewnie, ale to dlatego, że są wtedy tym samym obiektem. Python obiecuje, że powinny mieć wartość równą, jeśli będą porównywać. –