为什么“无在numpy.asarray(......)”引起警示未来

为什么“无在numpy.asarray(......)”引起警示未来

问题描述:

,当你做这样的事情今后发生警告:为什么“无在numpy.asarray(......)”引起警示未来

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

目前返回False,但我知道将返回在未来版本的Numpy中包含[False,False,False,True]的数组。

正如讨论的on the numpy discussion list解决方法是测试a is None

什么让我困惑的是in关键字与一维数组的这种行为相比列表:

>>> 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(见注释) - 实际上有两个不同的问题:

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

numpy的版本是1.9.1,3.4.1的Python

+1

为什么你的数组包含'None'?用'None'查看一个例子的'dtype'。那是你要的吗?你有没有把'None'与'np.nan'混淆? – hpaulj

+0

我正在使用可能包含“无”的数据。我知道'None'不是'np.nan'。我的确切情况比我的例子更复杂,但这与问题无关。 看着'dtype'确实可以工作。谢谢。 顺便提一下,np.asarray([1,2,3,np.nan])中的np.nan也会返回False。所以也许我的问题应该是关于''in'和numpy数组。 – szmoore

+0

尽管如果你从一个有'None'的矩阵中取一个slice,即使这个slice没有'None','dtype'仍然是'object'。 – szmoore

,当你做这样的事情今后发生警告:

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

目前返回False,但我明白会在未来版本的Numpy中返回包含[False,False,False,True]的数组。

正如我在评论中提到,你的例子是不正确。未来版本的numpy将返回[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) 

什么让我困惑的是in关键字与一维数组的这种行为相比列表

当您测试x in y时,您致电y.__contains__(x)。当y是一个列表,__contains__基本上没有沿着此线的东西:

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

据我所知,np.ndarray.__contains__(x)执行的这相当于:

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

也就是说它测试首先将整个数组中的元素相等(y == x将是一个大小为y的布尔数组)。因为在你的情况下,你正在测试是否y == None,这将提高FutureWarning出于上述原因。

在评论你也想知道为什么

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

回报False,但

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

回报True。第一部分容易解释为np.nan != np.nansee here for the rationale behind this)。要理解第二种情况为什么返回True,请记住list.__contains__()在检查相等性(==)之前首先检查标识(is)。由于np.nan is np.nan,第二种情况将返回True

+1

对不起!我没有注意到我的例子应该是'[1,2,3,None] == None' not'[1,2,3,4] == None' - 我已经纠正了这个问题。 – szmoore

+0

很好的答案,谢谢。 – szmoore