为什么“无在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(见注释) - 实际上有两个不同的问题:
- 为什么这是否会导致
FutureWarning
- 将None in numpy.asarray(...)
的未来行为与现在的行为进行比较? - 为什么从
list
的in
行为的差异;我可以测试我的数组是否包含None
而不将其转换为列表或使用for
循环?
numpy的版本是1.9.1,3.4.1的Python
,当你做这样的事情今后发生警告:
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.nan
(see here for the rationale behind this)。要理解第二种情况为什么返回True
,请记住list.__contains__()
在检查相等性(==
)之前首先检查标识(is
)。由于np.nan is np.nan
,第二种情况将返回True
。
为什么你的数组包含'None'?用'None'查看一个例子的'dtype'。那是你要的吗?你有没有把'None'与'np.nan'混淆? – hpaulj
我正在使用可能包含“无”的数据。我知道'None'不是'np.nan'。我的确切情况比我的例子更复杂,但这与问题无关。 看着'dtype'确实可以工作。谢谢。 顺便提一下,np.asarray([1,2,3,np.nan])中的np.nan也会返回False。所以也许我的问题应该是关于''in'和numpy数组。 – szmoore
尽管如果你从一个有'None'的矩阵中取一个slice,即使这个slice没有'None','dtype'仍然是'object'。 – szmoore