在数组中查找最小值 > 0

Posted

技术标签:

【中文标题】在数组中查找最小值 > 0【英文标题】:Find min value in array > 0 【发布时间】:2021-10-27 08:59:17 【问题描述】:

我正在寻找数组中的最低正值及其在列表中的位置。如果列表中的值重复,则仅对第一个实例感兴趣。这就是我所拥有的,它可以满足我的需求,但包含 0。

print "Position:", myArray.index(min(myArray))
print "Value:", min(myArray)

例如,如果,

myArray = [4, 8, 0, 1, 5]

那么位置:2,值:0

我希望它显示位置:3,值:1

【问题讨论】:

你能在你的数组中得到重复的值吗?如果是这样,您是否只对一审的位置感兴趣? 重复是很有可能的,是的,第一个实例是感兴趣的,感谢您指出这一点,将修改问题 我对问题描述感到困惑:它说“我正在寻找一个数组中大于 0 的最小值及其对应位置”,这对我来说就像任务是找到大于零且大于其对应位置的最小值。我想这实际上是为了找到大于零的最小值(及其位置)...... 请注意,如果列表中没有大于 0 的项目,下面给出的所有解决方案都将失败。 【参考方案1】:

这是使用生成器表达式的另一种方法。请注意来自 enumerate (a 和 b) 的值如何在元组中交换以正确排序。

value,position = min(((b,a) for a,b in enumerate(myArray) if b>0), default=(None,None))

当生成器表达式不返回任何内容(即没有大于 0 的项目)时,将返回默认参数。默认值可以设置为周围程序逻辑中任何有意义的值 - 这里返回 None 将允许您使用 if value:if position: 进行测试

【讨论】:

这应该被接受,它比其他答案更 Pythonic 和更快。 如果它能够容忍没有值 >0 的情况就好了。 @EL_DON - 那怎么样?在意识到min 有一个默认参数之前,我尝试了几种笨拙的方法。 我的版本似乎没有min 的默认参数。不过,看起来是一个很好的解决方案。另外,我发现如果我正确地形成我的输入,我就不会遇到问题。想象一下。 @EL_DON 好像是3.4加入的【参考方案2】:

复杂/算法的方式:

int min = array[0], i = 1
list smallest //list of indexes of the smallest element 

// find the first element greater than 0
while (min <= 0 and i < array.length) 
    min = array[i]
    i++


// find the first instance of the smallest element greater than 0
while (i < array.length) 
    if (array[i] < min and array[i] > 0) 
        clear the list
        min = array[i]
        list.append(i)
    
    else if (array[i] == min) 
        list.append(i)
    
    i++;

大于 0 的最小元素的第一个实例现在是您添加到列表中的第一个元素。

编辑:您还将获得每个最小值索引的列表。一些简单的检查可以告诉你数组中是否没有大于0的元素,或者列表是否为空等。

【讨论】:

我会说使用 for 比使用 while 更 Pythonic,尤其是在这种情况下。此外,如果您需要索引和值,枚举是要走的路,正如在thefourthey answer中指出的那样 没错,不过,我会按原样保留答案。对于任何对为什么会这样感兴趣的人,请查看:***.com/questions/920645/…【参考方案3】:
import numpy as np

x = np.array([1,2,0,5,10])
x = np.extract(x>0,x)
min_index = np.amin(x)
min_value = np.argmin(x)

【讨论】:

【参考方案4】:

您可以将generator expression 与min 一起使用。这会将m 设置为a 中大于0 的最小值。然后它使用list.index 查找该值第一次出现的索引。

a = [4, 8, 0, 1, 5]

m = min(i for i in a if i > 0)

print("Position:", a.index(m))
print("Value:", m)
# Position: 3
# Value: 1

【讨论】:

@user3001499 我对你问题中的措辞感到困惑,现在添加了一条评论来解释我的困惑。 在最坏的情况下,此解决方案需要遍历a 两次(如果最小值位于列表末尾)。 是的,老实说,如果我接受的话,我会接受下面的 thefourtheye 的回答(这就是我赞成它的原因)。 @user3001499 我建议您使用 thefourtheye 的解决方案(如果您不接受我的帮助也不会感到难过 :)) @Ffisegydd 我是 python 新手,并被建议避免使用 lambda 表达式,直到我对使用该语言更有信心,所以感谢您的建议,但现在我将使用您的答案 请注意,如果列表 a 的所有成员都不大于零,则此技术将引发 ValueError【参考方案5】:

然后添加一个过滤器:

myArray = [4, 8, 0, 1, 5]
result = min(filter(lambda x: x > 0, myArray))
print result # 1
print myArray.index(result) # 3

【讨论】:

只给出最低值;它没有给出数组中的位置。【参考方案6】:

你可以使用min函数和enumerate函数,像这样

result = min(enumerate(a), key=lambda x: x[1] if x[1] > 0 else float('inf'))
print("Position : , Value : ".format(*result)
# Position : 3, Value : 1

这确保如果该值大于0,则使用该值进行最小值比较,否则使用最大可能值 (float('inf'))。

由于我们与项目的实际索引一起迭代,我们不必通过另一个循环找到实际索引。

【讨论】:

我第一次看到以这种方式使用枚举,很好的提示! 赞成这个,因为它是第一个使用 enumerate 的(避免遍历 a 两次)。 赞成使用 min 函数的关键参数 - 而不是使用生成器循环。【参考方案7】:
def find_min_position(array):
    plus_array = [elem for elem in array if elem > 0]
    min_elem = min(plus_array)
    return min_elem, array.index(min_elem)

In : find_min_position([4, 8, 0, 1, 5])
Out: (1, 3)

【讨论】:

以上是关于在数组中查找最小值 > 0的主要内容,如果未能解决你的问题,请参考以下文章

在索引 0 为 0 的数组中查找非零最小值 C++

在Python中查找给定数组中最小值的索引

在数组中查找局部最小值

查找数组最小值最大值

二分查找--循环数组找最小值

查找数组中的绝对最小值