2015-02-05 16 views
13

Die Zukunft Warnung Warnung geschieht, wenn Sie so etwas tun:Warum „None in numpy.asarray (...)“ eine Zukunft führen

>>> numpy.asarray([1,2,3,None]) == None 

die derzeit False zurückkehrt, aber ich verstehe, wird eine Rückkehr Array mit [False,False,False,True] in einer zukünftigen Version von Numpy.

Wie diskutiert on the numpy discussion list der Weg um dies zu testen ist a is None.

Was ich verwirrt, ist das Verhalten des in Schlüsselwort mit einem 1D-Array im Vergleich zu einer Liste:

>>> None in [1,2,3,None] 
True 
>>> None in numpy.asarray([1,2,3,None]) 
__main__:1: FutureWarning: comparison to 'None' will result in an elementwise 
    object comparison in the future 
False 
>>> 1 in numpy.asarray([1,2,3,None]) 
True 

EDIT (siehe Kommentare) - Es gibt wirklich zwei verschiedene Fragen:

  1. Warum verursacht dies eine FutureWarning - was wird das zukünftige Verhalten von None in numpy.asarray(...) mit dem verglichen werden, was es jetzt ist?
  2. Warum der Unterschied im Verhalten von in von einem list; kann ich testen, ob mein Array None enthält, ohne es in eine Liste zu konvertieren oder eine for-Schleife zu verwenden?

Numpy Version ist 1.9.1, Python 3.4.1

+1

Warum sollte Ihr Array "None" enthalten? Sehen Sie sich den 'dtype' eines Beispiels mit' None' an. Ist es das was du willst? Vermischst du zufällig 'None' mit' np.nan'? – hpaulj

+0

Ich verwende Daten, die 'None' enthalten könnten. Ich weiß, dass 'None' nicht' np.nan' ist. Meine genaue Situation ist komplizierter als mein Beispiel, aber das ist nicht wirklich relevant für die Frage. Blick auf den 'dtype' funktioniert aber. Vielen Dank. Übrigens, 'np.nan in np.asarray ([1,2,3, np.nan])' wird auch 'False' zurückgeben. Also sollte meine Frage im Allgemeinen "in" und numpy Arrays sein. – szmoore

+0

Obwohl "dtype" immer noch "object" ist, wenn Sie ein Segment von einer Matrix nehmen, die 'None' enthält, auch wenn dieses Segment keine' None' enthält. – szmoore

Antwort

7

Die Zukunft Warnung geschieht, wenn Sie so etwas tun:

numpy.asarray([1,2,3,4]) == None 

die derzeit False zurückkehrt, aber ich verstehe, wird gibt ein Array zurück, das [False,False,False,True] in einer zukünftigen Version von Numpy enthält.

Wie ich in den Kommentaren erwähnte, ist Ihr Beispiel falsch. Zukünftige Versionen von numpy würden [False ,False, False, False] zurückgeben, d.h. False für jedes Element in dem Array, das nicht gleich None ist. Dies ist im Einklang mit wie elementweise Vergleiche mit anderen skalaren Werten zur Zeit arbeiten, zB:

In [1]: np.array([1, 2, 3, 4]) == 1 
Out[1]: array([ True, False, False, False], dtype=bool) 

In [2]: np.array(['a', 'b', 'c', 'd']) == 'b' 
Out[2]: array([False, True, False, False], dtype=bool) 

Was ich verwirrt, ist das Verhalten des in Schlüsselwort mit einem 1D-Array im Vergleich zu einer Liste

Wenn Sie x in y testen, rufen Sie y.__contains__(x). Wenn y eine Liste ist, tut __contains__ grundsätzlich etwas entlang der Linien von dieser:

for item in y: 
    if (item is x) or (item == x): 
     return True 
return False 

Soweit ich das beurteilen kann, führt np.ndarray.__contains__(x) das Äquivalent dieser:

if any(y == x): 
    return True 
else: 
    return False 

, dass sie sagen, ist testet elementweise Gleichheit über das gesamte Array zuerst (y == x wäre ein Boolesches Array der Größe y). Da in Ihrem Fall testen, ob y == None, wird dies die FutureWarning aus den oben genannten Gründen erhöhen.

In den Kommentaren Sie wollten auch, warum

np.nan in np.array([1, 2, 3, np.nan]) 

kehrt False, wissen aber

np.nan in [1, 2, 3, np.nan] 

kehrt True. Der erste Teil erklärt sich leicht durch die Tatsache, dass np.nan != np.nan (see here for the rationale behind this). Um zu verstehen, warum der zweite Fall True zurückgibt, denken Sie daran, dass zuerst list.__contains__() auf Identität überprüft wird (is), bevor Sie die Gleichheit überprüfen (==). Seit np.nan is np.nan gibt der zweite Fall True zurück.

+1

Entschuldigung! Ich habe nicht bemerkt, dass mein Beispiel sein sollte "[1,2,3, None] == None' not' [1,2,3,4] == None' - Ich habe die Frage korrigiert. – szmoore

+0

Gute Antwort, danke. – szmoore

Verwandte Themen