python - 在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]))
上面的代码只返回矩阵的绝对最小值和绝对最大值的索引,我想找到下一个最小值的索引和下一个最大值的索引。我怎样才能做到这一点?理想情况下,我想返回矩阵的两个最大值的索引和矩阵的两个最小值的索引。我怎样才能做到这一点?
解决方案
我可以想到几种方法来做到这一点。其中一些取决于您需要搜索多少数据。
一些警告:当只有 1、2、3 个元素时,您必须决定要做什么,或者如果所有值都相同,您是否希望 min、max 等相同?如果 max 或 min 或 min2, max2 中有多个项目怎么办?应该选择哪个?
- 运行 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)]))
- 对数据进行排序(如果您需要对数据进行排序,这是一个不错的选择),然后只需抓取两个最小和最大的数据。这不是很好,除非您需要对它进行排序,因为有很多副本和比较要排序。
PSEUDO CODE:
euclidean_matrix.sort()
min_index = 0
min_index2 = 1
max_index = len(euclidean_matrix) - 1
max_index2 = max_index - 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)
编辑:添加伪代码
推荐阅读
- javascript - Discord.js 删除频道
- ios - Swift - View Controller 完成处理程序的交互式关闭
- python - 如何使用 Pandas 删除多个 excel 文件的列值并保存每个文件而不合并它们
- javascript - JavaScript AJAX:获取两个对象作为响应
- php - 为什么以下 SQL 查询返回空结果?
- php - 如何将我的 HTML 项目链接到 laravel?
- c - 如何从c中的3d数组中删除字符串元素
- sql-server - 将本地 SQL Server 数据库从 Visual Studio 签入 GitHub 存储库
- r - corrplot.mixed 情节在 r 笔记本中被切断
- reactjs - FullCalendar 最初是空白的 Reactjs