【问题标题】:numpy.argmin for elements greater than a thresholdnumpy.argmin 用于大于阈值的元素
【发布时间】:2016-10-24 16:43:16
【问题描述】:

我有兴趣在满足特定条件(在我的情况下为中等阈值)的一维 NumPy 数组中获取最小值的位置。例如:

import numpy as np

limit = 3
a = np.array([1, 2, 4, 5, 2, 5, 3, 6, 7, 9, 10])

我想有效地屏蔽a 中所有低于限制的数字,这样np.argmin 的结果将为 6。是否有一种计算成本低廉的方法来屏蔽不满足条件的值然后申请np.argmin?

【问题讨论】:

  • 您能解释一下为什么在您的问题中您说 np.argmin 是 6 吗?在这种情况下,它将是 0。如果你屏蔽了所有小于 3 的数字,那么你会得到 [4,5,5,3,6,7,9,10]。这个的 np.argmin 还不是 6。
  • @OneRaynyDay 我的猜测:OP 想到的掩码数组是[--, --, 4, 5, --, 5, 3, 6, 7, 9, 10]。那么最小的元素是 3,它位于掩码数组的位置 6(从 0 开始计数)。这就是 MaxPowers 的回答中发生的情况。

标签: python arrays performance numpy


【解决方案1】:

这可以简单地使用numpy的MaskedArray来完成

import numpy as np

limit = 3
a = np.array([1, 2, 4, 5, 2, 5, 3, 6, 7, 9, 10])
b = np.ma.MaskedArray(a, a<limit)
np.ma.argmin(b)    # == 6

【讨论】:

  • 为什么不b.argmin()
  • 另一种可能性:b = np.ma.masked_less(a, limit).
【解决方案2】:

您可以存储有效索引并使用这些索引从a 中选择有效元素,并使用argmin() 在所选元素中进行索引以获得最终索引输出。因此,实现看起来像这样 -

valid_idx = np.where(a >= limit)[0]
out = valid_idx[a[valid_idx].argmin()]

示例运行 -

In [32]: limit = 3
    ...: a = np.array([1, 2, 4, 5, 2, 5, 3, 6, 7, 9, 10])
    ...: 

In [33]: valid_idx = np.where(a >= limit)[0]

In [34]: valid_idx[a[valid_idx].argmin()]
Out[34]: 6

运行时测试-

对于性能基准测试,在本节中,我将other solution based on masked array 与本文前面针对各种数据大小提出的基于常规 数组的解决方案进行比较。

def masked_argmin(a,limit): # Defining func for regular array based soln
    valid_idx = np.where(a >= limit)[0]
    return valid_idx[a[valid_idx].argmin()]

In [52]: # Inputs
    ...: a = np.random.randint(0,1000,(10000))
    ...: limit = 500
    ...: 

In [53]: %timeit np.argmin(np.ma.MaskedArray(a, a<limit))
1000 loops, best of 3: 233 µs per loop

In [54]: %timeit masked_argmin(a,limit)
10000 loops, best of 3: 101 µs per loop

In [55]: # Inputs
    ...: a = np.random.randint(0,1000,(100000))
    ...: limit = 500
    ...: 

In [56]: %timeit np.argmin(np.ma.MaskedArray(a, a<limit))
1000 loops, best of 3: 1.73 ms per loop

In [57]: %timeit masked_argmin(a,limit)
1000 loops, best of 3: 1.03 ms per loop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2021-09-25
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多