python - 大于阈值的元素的 numpy.argmin

标签 python arrays performance numpy

我感兴趣的是获取一维 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?

的廉价方法

最佳答案

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

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

sample 运行-

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

关于python - 大于阈值的元素的 numpy.argmin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973135/

相关文章:

Python:如何通过切片插入列表?

c++ - 如何填充和编辑 map 的std::array

ruby - 如何在 Ruby 中声明一个二维数组

mysql - 令人困惑的 MySQL 解释结果

python - 将函数应用于数据帧以创建列表的矢量化方式

python - Groupby 多年来每个月的最大值和最小值

python - urllib2 尝试并排除 404

java - 失败的测试用例,我做错了什么?

c++ - 有限状态机的速度 - 面向对象与程序

android - 在android上调整位图大小的最有效内存方法?