numpy argmax在值超过数组中的最大值时不工作

iovurdzv  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(125)
list_val = [ 30, 120, 240, 510]
num = 900

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

字符串
我想找到数组中第一个大于num的元素的位置
上面代码的输出是0。但是,由于900大于510,结果应该是3。我如何修复它?
--编辑
我想要一个解决方案,如果num是20,200或900。

70gysomp

70gysomp1#

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项是False
您可能需要对所有False测试x>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

dgiusagp

dgiusagp2#

argmax()的例子:

import numpy as np
a=np.array([30, 120, 240, 510])
np.argmax(a)

字符串
输出:

3


你的代码evals 0是因为np.asarray(list_val) > num是一个数组,其条目都是False,即没有元素大于num,所以np.argmaxFalse视为0,并将0作为argmax抛出。
如果你想有一个阈值,试试np.argmax(a[a<num])

num = 900
np.argmax(a[a<num])


输出:

3


或者:

a=np.array([30, 120, 240, 510])
num = 200
np.argmax(a[a<num])


输出:
如果没有满足阈值,这将引发ValueError而不是0

num = 20
np.argmax(a[a<num])


输出:

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-10-d373c6004311> in <cell line: 3>()
      1 a=np.array([30, 120, 240, 510])
      2 num = 20
----> 3 np.argmax(a[a<num])

2 frames

/usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
     55 
     56     try:
---> 57         return bound(*args, **kwds)
     58     except TypeError:
     59         # A TypeError occurs if the object does have such a method in its

ValueError: attempt to get argmax of an empty sequence

相关问题