为什么"numpy.asarray(...)中的无"会导致未来的警告

szm*_*ore 13 python numpy nan

当您执行以下操作时,会发生未来警告:

>>> 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)

编辑(见评论) - 真的有两个不同的问题:

  1. 为什么这会导致FutureWarning- 将未来的行为None in numpy.asarray(...)与现在的行为进行比较?
  2. 为什么行为的差异in来自于list; 我可以测试我的数组是否包含None而不将其转换为列表或使用for循环?

Numpy版本是1.9.1,Python 3.4.1

ali*_*i_m 7

当您执行以下操作时,会发生未来警告:

numpy.asarray([1,2,3,4]) == None
Run Code Online (Sandbox Code Playgroud)

目前返回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 == NoneFutureWarning因为上面给出的原因而提高.

在评论中你也想知道原因

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.