为什么numpy.argmax为所有False bool的列表产生零?

时间:2017-08-18 21:51:14

标签: python numpy

我使用numpy.argmax来计算第一个索引,其中True可以在bool向量中找到。调用pandas.Series会给我系列索引而不是元素索引。

我发现我的代码中有一个微妙的错误,当向量全部为假时会弹出;在这种情况下返回索引0似乎很危险,因为True很可能是True在第一个元素中的情况。这个回报值的设计选择是什么?

>>> numpy.argmax([False,False,False])
0
>>> numpy.argmax([True, False, True])
0

>>> s = pandas.Series( [ False, False, False ] , index=[3,6,9] )
>>> numpy.argmax(s)
3
>>> s1 = pandas.Series( [ True, False, False ] , index=[3,6,9] )
>>> numpy.argmax(s1)
3

3 个答案:

答案 0 :(得分:4)

来自源代码:

In case of multiple occurrences of the maximum values, the indices corresponding to the first occurrence are returned.

在向量全为False的情况下,最大值为零,因此返回第一次出现的最大值的索引,即0。

答案 1 :(得分:1)

所以在一天结束时,它是对argmax(这是一个简单的函数)的误解,忘记了FalseTrue是有订单的值。在使用argmax作为查找特定元素(任何True元素的索引)并期望它的行为类似于常见find函数的工具时,我对这些现实视而不见在元素不退出的条件下,使用返回空列表[]-1作为索引,甚至None的常用约定。

我编写了我的最终解决方案,如下所示

s = pandas.Series( listOfBools )
idx = s.argmax()

if idx == s.index[0] and not s[idx] :
   return -1
return idx

答案 2 :(得分:1)

如果你正在使用pandas,你可以用它自己掩盖布尔系列,然后取该系列的最小值或最大值吗?如果没有True值,则给出nan。

>>> s = pd.Series([False, False, True, False, True, False], 
                  index=[0, 1, 2, 3, 4, 5])
>>> s[s].index.max()
4
>>> s[s].index.min()
2
>>> s = pd.Series([False, False, False], index=[0,1,2])
>>> s[s].index.max()
nan