我使用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
答案 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
(这是一个简单的函数)的误解,忘记了False
和True
是有订单的值。在使用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