2015-11-27 11 views
22

Apparantly che verrà (nel 'futuro') non essere più possibile utilizzare il seguente:Confronto con `none` si tradurrà in un oggetto elementwise

import numpy as np 
np.array([0,1,2]) == None 
> False 
> FutureWarning: comparison to `None` will result in an elementwise object comparison in the future. 

Questo rompe anche il modello di lazy loading per gli array numpy :

import numpy as np 
def f(a=None): 
    if a == None: 
     a = <some default value> 
    <function body> 

Quali altre possibilità permetterà di utilizzare ancora l'inizializzazione pigra?

+2

Quale versione di Numpy ('np.version.version') ottieni con questo errore? Inoltre, hai provato che 'è None' invece di' == None'? AFAIK, 'is' non può essere sovrascritto, quindi' numpy.array' non può definire un'operazione 's' element-wise. –

+1

@tobias a) versione '1.9.2' b) è Nessuno funziona senza un avviso grazie – Matthias

risposta

47

Stai cercando is:

if a is None: 
    a = something else 

Il problema è che, usando l'operatore ==, se l'elemento di input a è un array NumPy, NumPy si tenta di eseguire un elemento saggio confronto e ti dirà che non puoi confrontarlo.

Per a un array numpy, a == None restituisce un errore, np.all(a == None) non (ma non fa ciò che ci si aspetta). Invece, a is None funzionerà indipendentemente dal tipo di dati di a.

+0

così da un punto di vista Java, il 'is' è considerato come un controllo di riferimento mentre il' == 'è considerato come un' equals() 'check (che potrebbe essere sovrascritto e se non sovrascritto è solo un controllo di riferimento) – Matthias

+1

@Matthias Esattamente. Da un punto di vista java, il python '==' innescherebbe java '.equals', che in' numpy' è sovrascritto per eseguire un controllo * element-wise *. Python's 'is' sarebbe equivalente al controllo di riferimento in java (simile all'utilizzo di' == 'con le stringhe). Tuttavia, per le stringhe in python (ad es. 'A = 'hello'; b = 'hello''),' a is b' restituirebbe true, poiché entrambi sono la stessa costante ('' hello''). –

+1

@Matthias dare un'occhiata [questa eccellente risposta] (http://stackoverflow.com/questions/13650293/understanding-pythons-is-operator), per ulteriori dettagli sull'operatore 'is'. –

Problemi correlati