【发布时间】:2017-04-30 14:51:12
【问题描述】:
我有一个数组a,我想在a 中找到给定值仍然大于的最大元素的位置。
在这个例子中:
a = np.array([0, 50, 5, 52, 60])
v = 55
v 大于 52 的最大元素(索引 3)所以我想返回 3。
numpy 函数 argmax() 不适用于此目的,因为它返回第一个元素。用 numpy 快速正确的方法是什么?
【问题讨论】:
我有一个数组a,我想在a 中找到给定值仍然大于的最大元素的位置。
在这个例子中:
a = np.array([0, 50, 5, 52, 60])
v = 55
v 大于 52 的最大元素(索引 3)所以我想返回 3。
numpy 函数 argmax() 不适用于此目的,因为它返回第一个元素。用 numpy 快速正确的方法是什么?
【问题讨论】:
您可以将argmax 与where 结合使用:
>>> np.nanargmax(np.where(a < v, a, np.nan))
3
np.where 在应用nanargmax 之前将所有高于v 的值替换为nan(在计算中忽略nans):
>>> np.where(a < v, a, np.nan)
array([ 0., 50., 5., 52., nan])
【讨论】:
np.ma.masked_array(a, a>=v).argmax(),但我不确定,因为我之前没有使用过掩码数组。
masked_arrays 也应该可以工作。我可能会使用np.ma.masked_greater_equal(a, v).argmax()。但是有人问了一种快速的方法,根据我的经验,掩码数组通常表现更差。
您可以对数组进行切片并自己找到最大值,然后查询其索引:
np.where(a==a[a<v].max())
Out: (array([3]),)
【讨论】:
a 中有这样一个元素 - 否则失败