如何在 Numpy 中构建 argsecondmax
How to build argsecondmax in Numpy
在 Numpy 中,argmax 已经定义,但我需要 argsecondmax,它基本上是第二个最大值。我该怎么办,我有点困惑?
您可以使用 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 () 提供的函数。
def argNmax(a, N, axis=None):
return np.take(np.argsort(a, axis=axis), -N)
寻找 Nth
最大的指数
一个高效的方法可以使用 np.argparition
跳过排序和简单的分区,当切片时会给我们所需的索引。我们还将其概括为沿指定轴找到 Nth
最大的一个或 全局 一个(类似于 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 版本的快速运行时测试 -
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
在 Numpy 中,argmax 已经定义,但我需要 argsecondmax,它基本上是第二个最大值。我该怎么办,我有点困惑?
您可以使用 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 (
def argNmax(a, N, axis=None):
return np.take(np.argsort(a, axis=axis), -N)
寻找 Nth
最大的指数
一个高效的方法可以使用 np.argparition
跳过排序和简单的分区,当切片时会给我们所需的索引。我们还将其概括为沿指定轴找到 Nth
最大的一个或 全局 一个(类似于 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
进行实际排序的好处,如
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