当您执行以下操作时,会发生未来警告:
>>> numpy.asarray([1,2,3,None]) == None
Run Code Online (Sandbox Code Playgroud)
目前返回False,但据我所知,将返回包含[False,False,False,True]在Numpy的未来版本中的数组.
正如在numpy讨论列表中所讨论的,解决这个问题的方法是测试a is None.
令我困惑的是,in与列表相比,具有1D数组的关键字的这种行为:
>>> 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
Run Code Online (Sandbox Code Playgroud)
编辑(见评论) - 真的有两个不同的问题:
FutureWarning- 将未来的行为None in numpy.asarray(...)与现在的行为进行比较?in来自于list; 我可以测试我的数组是否包含None而不将其转换为列表或使用for循环? Numpy版本是1.9.1,Python 3.4.1
当您执行以下操作时,会发生未来警告:
Run Code Online (Sandbox Code Playgroud)numpy.asarray([1,2,3,4]) == None目前返回
False,但据我所知,将返回包含[False,False,False,True]在Numpy的未来版本中的数组.
正如我在评论中提到的,您的示例是不正确的.numpy的未来版本将返回[False ,False, False, False],即False对于数组中不等于的每个元素None.这与当前其他标量值的元素比较方式更为一致,例如:
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)
Run Code Online (Sandbox Code Playgroud)
令我困惑的是,
in与列表相比,具有一维数组的关键字的这种行为
当你测试时x in y,你正在打电话y.__contains__(x).什么y是列表,__contains__基本上做了类似的事情:
for item in y:
if (item is x) or (item == x):
return True
return False
Run Code Online (Sandbox Code Playgroud)
据我所知,np.ndarray.__contains__(x)执行相当于:
if any(y == x):
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
也就是说它首先测试整个数组的元素相等(y == x将是一个大小为的布尔数组y).因为在你的情况下你正在测试是否y == None会FutureWarning因为上面给出的原因而提高.
在评论中你也想知道原因
np.nan in np.array([1, 2, 3, np.nan])
Run Code Online (Sandbox Code Playgroud)
回来False,但是
np.nan in [1, 2, 3, np.nan]
Run Code Online (Sandbox Code Playgroud)
回报True.第一部分很容易通过以下事实来解释np.nan != np.nan(参见此处的基本原理).要理解第二种情况返回的原因True,请记住在检查equality()之前list.__contains__()首先检查identity is(==).因为np.nan is np.nan,第二种情况将返回True.