首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Numpy中建立Numpy

如何在Numpy中建立Numpy
EN

Stack Overflow用户
提问于 2018-04-14 13:54:08
回答 2查看 233关注 0票数 3

在Numpy中,雅克马克斯已经定义好了,但是我需要argsecondmax,它基本上是第二个最大值。我怎么能这样做,我有点困惑?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-14 14:22:13

Nth 寻找最大指数

一个有效的方法可以使用np.argparition,它跳过排序和简单的解析,当切片时,这将为我们提供所需的索引。我们还会将其概括为沿着指定的轴查找Nth最大的轴或全局的轴(类似于ndarray.argmax()),如-

代码语言:javascript
复制
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)

样本运行-

代码语言:javascript
复制
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最小的一个,我们将有-

代码语言:javascript
复制
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)

样本运行-

代码语言:javascript
复制
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进行实际排序的好处,如@pythonic833's post中所示,下面是对全局argmax版本的快速运行时测试-

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2018-04-14 14:16:29

您可以使用np.argsort这样做。

代码语言:javascript
复制
test =np.random.randint(1,5,10)

输出

代码语言:javascript
复制
array([3, 2, 3, 1, 4, 1, 3, 1, 3, 3])

为了得到第二个最大值

代码语言:javascript
复制
test[np.argsort(test)[-2]]

np.argsort按升序排序,因此对于最大值我们取最后一个值,对于第二个最大值取最后一个值。

编辑:为了改进这个答案,我编写了一个类似于one Divakar (https://stackoverflow.com/a/49832435/9534390)提供的函数。

代码语言:javascript
复制
def argNmax(a, N, axis=None):
    return np.take(np.argsort(a, axis=axis), -N)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49832185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档