在数组中查找最小值 > 0
Posted
技术标签:
【中文标题】在数组中查找最小值 > 0【英文标题】:Find min value in array > 0 【发布时间】:2015-03-14 01:01:09 【问题描述】:我正在寻找数组中的最低正值及其在列表中的位置。如果列表中的值重复,则仅对第一个实例感兴趣。这就是我所拥有的,它可以满足我的需求,但包含 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的主要内容,如果未能解决你的问题,请参考以下文章