2017-07-17 44 views
-2
list_val = [ 30, 120, 240, 510] 
num = 900 

np.argmax(np.asarray(list_val) > num) 

我想找到在阵列的第一元件,其大于numnumpy的argmax不工作

以上从代码的输出为0。然而的位置时,由于900是更大的比510,结果应该是3.我该如何解决它?

--edit

我想如果num为20,200或900

+0

简单'np.argmax(np.asarray(list_val))',我怀疑。否则,我不明白你想达到什么目的? – MariusSiuram

+0

所以我不知道如果num将是900或200或20。是否有解决方案适用于所有情况? – user308827

+1

你可以尝试以更好/详细的方式解释为什么它应该是3? – Divakar

回答

1
In [248]: x = np.array([ 30, 120, 240, 510]) 
In [249]: x>200 
Out[249]: array([False, False, True, True], dtype=bool) 
In [250]: np.argmax(_) 
Out[250]: 2 
In [251]: x>400 
Out[251]: array([False, False, False, True], dtype=bool) 
In [252]: np.argmax(_) 
Out[252]: 3 
In [253]: x>600 
Out[253]: array([False, False, False, False], dtype=bool) 
In [254]: np.argmax(_) 
In [255]: np.max(__) 
Out[255]: False 

随着大的门槛,比较产生所有False。最大值是False,第0项是那个。

您可能必须测试所有Falsex>n,并在此情况下返回不同的值。这不是一个普遍定义的行为。

列表有发现

In [261]: (x>200).tolist().index(True) 
Out[261]: 2 
In [262]: (x>400).tolist().index(True) 
Out[262]: 3 
In [263]: (x>600).tolist().index(True) 
... 
ValueError: True is not in list 

stringfind回报-1如果找不到值。


In [266]: def foo(test): 
    ...:  if not test.any(): 
    ...:   return -1 
    ...:  return np.argmax(test) 
    ...: 
In [267]: foo(x>200) 
Out[267]: 2 
In [268]: foo(x>400) 
Out[268]: 3 
In [269]: foo(x>600) 
Out[269]: -1 
0

a=np.array([ 30, 120, 240, 510])一个可行的解决方案。 np.argmax()会给你3。您的密码0是因为np.asarray(list_val) > num是一个阵列,其条目全部为False,即没有元素大于num,因此np.argmax需要False为0并且投出0作为argmax

如果您想要设置阈值,请尝试np.argmax(a[a<num])。如果没有达到阈值,这将增加ValueError而不是0