Il primo confronto non è significativo, il secondo è significativo.
Con numpy.int16 > numpy.float32
stiamo confrontando due type
oggetti:
>>> type(numpy.int16)
type
>>> numpy.int16 > numpy.float32 # I'm using Python 3
TypeError: unorderable types: type() > type()
In Python 3 questo paragone non regge immediatamente poiché non v'è nessun ordinamento definito per type
istanze. In Python 2, viene restituito un valore booleano ma non può essere invocato per coerenza (ricade sul confronto tra gli indirizzi di memoria o altre cose a livello di implementazione).
Il secondo confronto fa funziona in Python 3 e funziona in modo coerente (lo stesso in Python 2). Questo perché ora stiamo confrontando dtype
casi:
>>> 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
Qual è la logica che sta dietro questo ordinamento?
dtype
Le istanze sono ordinate a seconda che si possa lanciare (in sicurezza) a un'altra. Un tipo è inferiore a un altro se può essere cast sicuro per quel tipo.
Per l'implementazione degli operatori di confronto, vedere descriptor.c; in particolare nella funzione arraydescr_richcompare
.
Ecco ciò che il <
mappe operatore a:
switch (cmp_op) {
case Py_LT:
if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(self, new)) {
result = Py_True;
}
else {
result = Py_False;
}
break;
In sostanza, NumPy solo controlla che i due tipi sono (i) non equivalenti, e (ii) che il primo tipo possono essere lanciate al secondo tipo .
Questa funzionalità è inoltre esposto nelle API NumPy come np.can_cast
:
fonte
2015-04-18 14:00:07
Per inciso, ho finito per scoprire e utilizzare 'np.find_common_type' ma sono ancora interessati a quello che stava succedendo qui. Grazie! – farenorth
Sto usando 'numpy' 1.9.2 su Windows, ed entrambi i confronti restituiscono' False'. Come nella risposta seguente, questo è privo di significato ed è stato rimosso in Python 3. – MattDMo