Pierwsze porównanie nie ma znaczenia, drugie ma znaczenie:.
Z numpy.int16 > numpy.float32
porównujemy dwie type
obiekty:
>>> type(numpy.int16)
type
>>> numpy.int16 > numpy.float32 # I'm using Python 3
TypeError: unorderable types: type() > type()
w Pythonie 3 porównanie to nie od razu, ponieważ nie ma zdefiniowane zamawianie type
przypadkach. W Pythonie 2 zwracana jest wartość logiczna, ale nie można na niej polegać dla spójności (wraca ona do porównywania adresów pamięci lub innych rzeczy na poziomie implementacji).
Drugie porównanie wykonuje działa w Pythonie 3 i działa konsekwentnie (to samo w Pythonie 2). To dlatego, że jesteśmy teraz porównując dtype
instancje:
>>> type(numpy.dtype('int16'))
numpy.dtype
>>> numpy.dtype('int16') > numpy.dtype('float32')
False
>>> numpy.dtype('int32') < numpy.dtype('|S10')
False
>>> numpy.dtype('int32') < numpy.dtype('|S11')
True
Jaka jest logika tej kolejności?
dtype
instancje są uporządkowane zgodnie z tym, czy można rzucać (bezpiecznie) do innego. Jeden typ to mniejszy niż inny, jeśli może być bezpiecznie odlewać do tego typu.
Aby wprowadzić operatorów porównania, spójrz na descriptor.c; konkretnie przy funkcji arraydescr_richcompare
.
Oto co <
mapy operatorowi:
switch (cmp_op) {
case Py_LT:
if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(self, new)) {
result = Py_True;
}
else {
result = Py_False;
}
break;
Zasadniczo NumPy tylko sprawdza, że oba typy są (i) nie są równoważne, oraz (ii) że pierwszy typ może być oddane do drugiego typu .
Ta funkcjonalność jest również wystawiony w API NumPy jak np.can_cast
:
Nawiasem mówiąc, skończyło się na odkrywaniu i używając 'np.find_common_type' ale nadal jestem zainteresowany tym, co dzieje się tutaj. Dzięki! – farenorth
Używam 'numpy' 1.9.2 na Windows, a oba porównania zwracają' Fałsz'. Tak jak w poniższej odpowiedzi, jest to bez znaczenia i zostało usunięte w Pythonie 3. – MattDMo