我在numpy中有一个1D数组,我想找到索引的位置,其中一个值超过numpy数组中的值。
E.g.
aa = range(-10,10)
在aa中找到超过5的位置。
我在numpy中有一个1D数组,我想找到索引的位置,其中一个值超过numpy数组中的值。
E.g.
aa = range(-10,10)
在aa中找到超过5的位置。
当前回答
我想求婚
np.min(np.append(np.where(aa>5)[0],np.inf))
这将返回满足条件的最小索引,而如果不满足条件则返回无穷大(并且where返回空数组)。
其他回答
你应该用np。而不是np。argmax。后者即使没有找到值也会返回位置0,这不是您期望的索引。
>>> aa = np.array(range(-10,10))
>>> print(aa)
array([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9])
如果满足条件,则返回一个索引数组。
>>> idx = np.where(aa > 5)[0]
>>> print(idx)
array([16, 17, 18, 19], dtype=int64)
否则,如果不满足,则返回一个空数组。
>>> not_found = len(np.where(aa > 20)[0])
>>> print(not_found)
array([], dtype=int64)
在这种情况下反对argmax的观点是:如果解决方案没有歧义,那么越简单越好。因此,要检查是否有东西符合条件,只需执行if len(np。Where (aa > value_to_search)[0]) > 0;
我对此也很感兴趣,我将所有建议的答案与perfplot进行了比较。(声明:我是perfplot的作者。)
如果您知道您正在查看的数组已经排序,那么
numpy.searchsorted(a, alpha)
是给你的。它是O(log(n))操作,也就是说,速度几乎不取决于数组的大小。没有比这更快的了。
如果你对数组一无所知,你就不会出错
numpy.argmax(a > alpha)
已经排序:
未分类的:
代码重现情节:
import numpy
import perfplot
alpha = 0.5
numpy.random.seed(0)
def argmax(data):
return numpy.argmax(data > alpha)
def where(data):
return numpy.where(data > alpha)[0][0]
def nonzero(data):
return numpy.nonzero(data > alpha)[0][0]
def searchsorted(data):
return numpy.searchsorted(data, alpha)
perfplot.save(
"out.png",
# setup=numpy.random.rand,
setup=lambda n: numpy.sort(numpy.random.rand(n)),
kernels=[argmax, where, nonzero, searchsorted],
n_range=[2 ** k for k in range(2, 23)],
xlabel="len(array)",
)
这样更快一些(看起来也更好一些)
np.argmax(aa>5)
因为argmax将在第一个True处停止(“如果最大值出现多次,则返回第一次出现的对应索引。”),并且不会保存另一个列表。
In [2]: N = 10000
In [3]: aa = np.arange(-N,N)
In [4]: timeit np.argmax(aa>N/2)
100000 loops, best of 3: 52.3 us per loop
In [5]: timeit np.where(aa>N/2)[0][0]
10000 loops, best of 3: 141 us per loop
In [6]: timeit np.nonzero(aa>N/2)[0][0]
10000 loops, best of 3: 142 us per loop
In [34]: a=np.arange(-10,10)
In [35]: a
Out[35]:
array([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9])
In [36]: np.where(a>5)
Out[36]: (array([16, 17, 18, 19]),)
In [37]: np.where(a>5)[0][0]
Out[37]: 16
我会说
i = np.min(np.where(V >= x))
其中V是向量(1d数组),x是值,i是结果索引。