当数值超过数组中的最大值时,numpy argmax无效

时间:2017-07-17 15:58:00

标签: python numpy

list_val = [ 30, 120, 240, 510]
num = 900

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

我想找到数组中第一个元素的位置,该位置大于num

上面代码的输出为0.但是,由于900大于510,结果应为3.我该如何解决?

- 编辑

如果num为20,200或900,我想要一个有效的解决方案。

2 个答案:

答案 0 :(得分: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项就是那个。

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

列表有一个发现

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

string find如果找不到值,则返回-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

答案 1 :(得分:0)

a=np.array([ 30, 120, 240, 510])np.argmax()将为您提供3。您的代码是0,因为np.asarray(list_val) > num是一个数组,其条目全部为False,即没有元素大于num,因此np.argmax需要False为0并抛出零为argmax

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