[英]Difference between maximum value in density plot from np.argmax() and figure
[英]Which is an efficient way to output the last value in np.argmax(array > value) instead of 0 if no element was found? [duplicate]
这个问题已经在这里有了答案:
让我们采取np.array:
array = np.array([[1, 4],
[0, 3],
[2, 3]])
我使用以下代码在第一列中找到第一个元素,该元素的值大于阈值:
index = np.argmax(array[:, 0] > threshold)
现在将阈值设为1,我得到了预期的索引:
>>index = 2
但是,如果我选择一个较大的2值,则输出为0。这会使我的程序混乱,因为如果没有元素满足阈值,我想取最后一个而不是第一个值。
在这种情况下,是否有一种有效的方法来获取数组的最后一个值?
我实际上不明白这对我有什么帮助: Numpy:如何在numpy数组的每一列中找到第一个非零值?
我宁愿在寻找使argmax返回False
而不是0的东西。
import numpy as np
import time
def first_nonzero(arr, axis, invalid_val=-1):
mask = arr != 0
return np.where(mask.any(axis=axis), mask.argmax(axis=axis), invalid_val)
array = np.random.rand(50000, 50000) * 10
test = array[:, 0]
threshold = 11
t1 = time.time()
index1 = np.argmax(array[:, 0] > threshold) if any(array[:, 0] > threshold) else len(array[:, 0])-1
elapsed1 = time.time() - t1
t2 = time.time()
index2 = first_nonzero(array[:, 0] > threshold, axis=0, invalid_val=len(array[:, 0])-1)
elapsed2 = time.time() - t2
print(index1, "time: ", elapsed1)
print(index2, "time: ", elapsed2)
>>49999 time: 0.012960195541381836
>>49999 time: 0.0009734630584716797
因此,@ Divakar的解决方案非常快! 非常感谢!
这是一种效率低下的方法,但是您可以使用numpy.argwhere
#check whether there are elements exceeding the threshold
present = np.argwhere(array[:, 0] > threshold)
if present.size == 0:
index = len(array)-1
else:
index = np.argmax(array[:, 0] > threshold)
尝试以下单线。 如果至少一个元素满足条件, argmax
获得argmax
索引。 否则取最后一个索引。
index = np.argmax(array[:,0]>threshold) if any(array[:,0]>threshold) else len(array[:,0])-1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.