首页 > 解决方案 > 在python中查找矩阵中两个最大值和两个最小值的索引

问题描述

我试图在 python 中找到两个最小值和两个最大值的索引:

我有

import sklearn
euclidean_matrix=sklearn.metrics.pairwise_distances(H10.T,metric='euclidean')

max_index =np.where(euclidean_matrix==np.max(euclidean_matrix[np.nonzero(euclidean_matrix)]))

min_index=np.where(euclidean_matrix==np.min(euclidean_matrix[np.nonzero(euclidean_matrix)]))

min_index
max_index

我得到以下输出

(array([158, 272]), array([272, 158]))
(array([ 31, 150]), array([150,  31]))

上面的代码只返回矩阵的绝对最小值和绝对最大值的索引,我想找到下一个最小值的索引和下一个最大值的索引。我怎样才能做到这一点?理想情况下,我想返回矩阵的两个最大值的索引和矩阵的两个最小值的索引。我怎样才能做到这一点?

标签: pythonarraysmatrix

解决方案


我可以想到几种方法来做到这一点。其中一些取决于您需要搜索多少数据。

一些警告:当只有 1、2、3 个元素时,您必须决定要做什么,或者如果所有值都相同,您是否希望 min、max 等相同?如果 max 或 min 或 min2, max2 中有多个项目怎么办?应该选择哪个?

  1. 运行 min 然后删除该元素 run min 其余部分。运行 max 然后删除该元素并在其余元素上运行(请注意,这是在原始元素上,而不是删除了 min 的元素)。这是效率最低的方法,因为它需要搜索 4 次并复制两次。(实际上是 8 次,因为我们找到了最小值/最大值,然后找到了索引。)类似于伪代码中的 。
PSEUDO CODE:

max_index = np.where(euclidean_matrix==np.max(euclidean_matrix[np.nonzero(euclidean_matrix)]))
tmp_euclidean_matrix = euclidean_matrix #make sure this is a deepcopy
tmp_euclidean_matrix.remove(max_index)  #syntax might not be right?
max_index2 = np.where(tmp_euclidean_matrix==np.max(tmp_euclidean_matrix[np.nonzero(tmp_euclidean_matrix)]))

min_index = np.where(euclidean_matrix==np.min(euclidean_matrix[np.nonzero(euclidean_matrix)]))
tmp_euclidean_matrix = euclidean_matrix #make sure this is a deepcopy
tmp_euclidean_matrix.remove(min_index)  #syntax might not be right?
min_index2 = np.where(tmp_euclidean_matrix==np.min(tmp_euclidean_matrix[np.nonzero(tmp_euclidean_matrix)]))
  1. 对数据进行排序(如果您需要对数据进行排序,这是一个不错的选择),然后只需抓取两个最小和最大的数据。这不是很好,除非您需要对它进行排序,因为有很多副本和比较要排序。
PSEUDO CODE:

euclidean_matrix.sort()
min_index  = 0
min_index2 = 1
max_index  = len(euclidean_matrix) - 1
max_index2 = max_index - 1
  1. 最好的选择是滚动您自己的搜索功能以在数据上运行,这将是最有效的,因为您只需浏览一次数据即可收集它们。

这只是一种简单的迭代方法,其他算法可能更有效。你会想要验证这个作品。

PSEUDO CODE:
def minmax2(array):
    """ returns (minimum, second minimum, second maximum, maximum)
    """
    if len(array) == 0:
        raise Exception('Empty List')
    elif len(array) == 1:
        #special case only 1 element need at least 2 to have different 
        minimum  = 0
        minimum2 = 0
        maximum2 = 0
        maximum  = 0
    else:
        minimum  = 0
        minimum2 = 1
        maximum2 = 1
        maximum  = 0
        for i in range(1, len(array)):
           if array[i] <= array[minimum]:
               # a new minimum (or tie) will shift the other minimum
               minimum2 = minimum 
               minimum  = i
           elif array[i] < array[minimum2]:
               minimum2 = i
           elif array[i] >= array[maximum]:
               # a new maximum (or tie) will shift the second maximum
               maximum2 = maximum
               maximum = i
           elif array[i] > array[maximum2]:
               maximum2 = i
    return (minimum, minimum2, maximum2, maximum)

编辑:添加伪代码


推荐阅读