Pythonic方法,在numpy数组中贪婪地查找具有最高和的32个值,而不重复行或列,并提取值的索引

2024-06-28 11:53:46 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:TLDR;如何在np数组中找到32对索引(i,j),使所有i和所有j都不同,并将A[i,j]求和得尽可能大?~感谢您的澄清

我对编程真的很陌生

假设我有一个566x566的np数组

我必须找到32个最高值,而不重复以前找到的值的行或列。 之后,我必须提取值的索引以回溯相应的特征

我尝试用pandas和numpy来实现这一点,方法是找到所有列的最大值,然后提取这些列的索引,然后丢弃行和列以构建更小的矩阵。然后用同样的方法在较小的矩阵上重复。但不知何故,它总是失败,因为有些函数是不合适的,或者有一个愚蠢的错误等等

我试着用pandas/numpy来实现它,因为它可以给我最简洁的代码,但老实说,每种方法都非常受欢迎。将原始数组切片到列表中并在其中查找最高值会导致内存使用过多

pd_cosine

''Python 对于pd_余弦中的n: maxRow=pd_cosine.max(axis=n)#等,但下面的代码不起作用。。。 '''

我在R中发现了一个类似的问题,如果有帮助的话,答案是:Algorithm to extract elements with largest sum from a matrix without repeating rows or columns?


Tags: 方法代码numpy编辑pandas编程np矩阵
1条回答
网友
1楼 · 发布于 2024-06-28 11:53:46

在这种特殊情况下(矩阵为正方形),可以使用scipy.optimize.linear_sum_assignmentreference

如果您将行视为任务,将列视为工作者,将矩阵条目视为成本,linear_sum_assignment尝试将任务分配给工作者,以使成本最小化(或者,在我们的例子中,最大化)

如果性能不是至关重要的,您可以简单地使用此算法并选择具有最大和的32个元素。然而,对于较大的矩阵,这可能是不可行的

下面是它的样子:

import numpy as np
from scipy.optimize import linear_sum_assignment

A = np.random.rand(566, 566)

row_ind, col_ind = linear_sum_assignment(A,maximize=True) # All elements for optimal assignment.
values_ind = A[row_ind, col_ind] # Get corresponding values.
ind_of_largest_32 = np.argsort(values_ind)[-32:] # Get the indices of the 32 largest elements.

row_ind_32 = row_ind[ind_of_largest_32]
col_ind_32 = col_ind[ind_of_largest_32]
values_ind_32 = A[row_ind_32, col_ind_32]

然后row_ind_32col_ind_32是对32个最大元素具有不同行和列索引的数组values_ind_32包含A的相应条目

编辑:如果A也是非方形的,它也可以工作

相关问题 更多 >