2024-09-30 06:26:32 发布
网友
在Numpy中,已经定义了argmax,但是我需要argsecondmax,它基本上是第二个最大值。我怎么能这样,我有点困惑?你知道吗
发现Nth最大指数
Nth
一个有效的方法可以使用^{},它跳过排序,而只是简单地划分部分,当划分部分时,它将为我们提供所需的索引。我们还将其推广到沿着指定轴找到Nth最大的一个或一个全局的一个(类似于ndarray.argmax()),如下-
ndarray.argmax()
def argNmax(a, N, axis=None): if axis is None: return np.argpartition(a.ravel(), -N)[-N] else: return np.take(np.argpartition(a, -N, axis=axis), -N, axis=axis)
示例运行-
In [66]: a Out[66]: array([[908, 770, 258, 534], [399, 376, 808, 750], [655, 654, 825, 355]]) In [67]: argNmax(a, N=2, axis=0) Out[67]: array([2, 2, 1, 0]) In [68]: argNmax(a, N=2, axis=1) Out[68]: array([1, 3, 0]) In [69]: argNmax(a, N=2) # global second largest index Out[69]: 10
寻找Nth最小指数
把它扩展到沿着一个轴或全局找到Nth最小的一个,我们会-
def argNmin(a, N, axis=None): if axis is None: return np.argpartition(a.ravel(), N-1)[N-1] else: return np.take(np.argpartition(a, N-1, axis=axis), N-1, axis=axis)
In [105]: a Out[105]: array([[908, 770, 258, 534], [399, 376, 808, 750], [655, 654, 825, 355]]) In [106]: argNmin(a, N=2, axis=0) Out[106]: array([2, 2, 1, 0]) In [107]: argNmin(a, N=2, axis=1) Out[107]: array([3, 0, 1]) In [108]: argNmin(a, N=2) Out[108]: 11
计时
为了说明使用argpartition而不是使用argsort实际排序的好处,如^{}所示,下面是对全局argmax版本的快速运行时测试-
argpartition
argsort
In [70]: a = np.random.randint(0,99999,(1000,1000)) In [72]: %timeit np.argsort(a)[-2] # @pythonic833's soln 10 loops, best of 3: 40.6 ms per loop In [73]: %timeit argNmax(a, N=2) 100 loops, best of 3: 2.12 ms per loop
您可以使用np.argsort这样做
np.argsort
test =np.random.randint(1,5,10)
输出
array([3, 2, 3, 1, 4, 1, 3, 1, 3, 3])
得到第二个最大值
test[np.argsort(test)[-2]]
np.argsort按升序排序,因此对于最大值,我们取最后一个值,对于第二个最大值,则取最后一个值。你知道吗
编辑:为了改进这个答案,我编写了一个类似于Divakar(https://stackoverflow.com/a/49832435/9534390)的函数。你知道吗
def argNmax(a, N, axis=None): return np.take(np.argsort(a, axis=axis), -N)
发现
Nth
最大指数一个有效的方法可以使用^{} ,它跳过排序,而只是简单地划分部分,当划分部分时,它将为我们提供所需的索引。我们还将其推广到沿着指定轴找到
Nth
最大的一个或一个全局的一个(类似于ndarray.argmax()
),如下-示例运行-
寻找
Nth
最小指数把它扩展到沿着一个轴或全局找到
Nth
最小的一个,我们会-示例运行-
计时
为了说明使用} 所示,下面是对全局argmax版本的快速运行时测试-
argpartition
而不是使用argsort
实际排序的好处,如^{您可以使用
np.argsort
这样做输出
得到第二个最大值
np.argsort
按升序排序,因此对于最大值,我们取最后一个值,对于第二个最大值,则取最后一个值。你知道吗编辑:为了改进这个答案,我编写了一个类似于Divakar(https://stackoverflow.com/a/49832435/9534390)的函数。你知道吗
相关问题 更多 >
编程相关推荐