从数组中的最小值获取下一个值

时间:2015-11-24 15:30:26

标签: arrays opencv numpy pixel

我有一个图像,它是一个数组。我希望得到最小值后的价值,我希望你理解我,因为我不会说英语。 此图像的像素中的最小值为-3.40282e + 38。我想知道-3.40282e + 38之后的值。

必须是例如0.3 0.4 ..

我尝试使用image.min()但它打印-3.40282e + 38 ..我需要下一个值。

我也试过

 minimo = img.min()
for i in range(rows):
 for j in range(cols):
     for k in img[i,j]:
          if k> minimo:
               print k.min()

但是我收到了这个错误

 TypeError: 'numpy.float32' object is not iterable

2 个答案:

答案 0 :(得分:2)

你可以这样做:

import numpy as np
sorted_vec = np.unique(img.reshape(-1))
second_smallest = sorted_vec[1]

答案 1 :(得分:1)

对于大型数组,使用np.partition将比排序数组快得多,如@dslack's answer中所示:

import numpy as np
img = np.random.rand(1000, 1000)

# Compute via a full sort
np.unique(img.ravel())[1]
# 3.25658401967e-06

# Compute via a partition
np.partition(img.ravel(), 1)[1]
# 3.25658401967e-06

这两种方法给出了相同的结果,我们可以看到分区方法明显更快:

%timeit np.unique(img.ravel())[1]
# 10 loops, best of 3: 86.8 ms per loop

%timeit np.partition(img.ravel(), 1)[1]
# 100 loops, best of 3: 4.99 ms per loop

速度的原因是partition不对整个数组进行排序,而只是交换值,直到所有较小的值都在给定索引的左边,而所有较大的值都在右边。

请注意,如果最小值不是唯一的,结果会有所不同 - 但是在您的问题中,您不清楚在这种情况下您想要哪个输出。