list_val = [ 30, 120, 240, 510]
num = 900
np.argmax(np.asarray(list_val) > num)
我想找到数组中第一个元素的位置,该位置大于num
上面代码的输出为0.但是,由于900大于510,结果应为3.我该如何解决?
- 编辑
如果num为20,200或900,我想要一个有效的解决方案。
答案 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
。