在数组中查找最小值 > 0

Find min value in array > 0

我要查找数组中的最小正值及其在列表中的位置。如果列表中的值重复,则只对第一个实例感兴趣。这就是我所拥有的,它可以做我想做的,但包括 0。

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

例如,如果,

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

然后位置:2,值:0

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

您可以将 generator expressionmin 一起使用。这会将 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

然后添加过滤器:

myArray = [4, 8, 0, 1, 5]
result = min(filter(lambda x: x > 0, myArray))
print result # 1
print myArray.index(result) # 3
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)

你可以使用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'))。

由于我们是根据项目的实际索引进行迭代的,因此我们不必使用另一个循环来查找实际索引。

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

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

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

进行测试
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)

复杂/算法方式:

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的元素,或者列表是否为空等等