Python 迭代numpy矩阵并获取所有得分大于gt的值

Python 迭代numpy矩阵并获取所有得分大于gt的值,python,python-3.x,numpy,numpy-ndarray,Python,Python 3.x,Numpy,Numpy Ndarray,我有一个公司列表(cmp_列表),其中我使用一些自定义算法将每个值与另一个值进行比较,并得出了所有分数的这个矩阵(分数矩阵)。如果您通读矩阵,您将看到第1行和第1列为1 bcoz,第一项为cmp_,列表与自身匹配,类似地,第3行和第3列为1。现在第1行col3为0 bcoz,cmp列表中的第一项与cmp_列表中的第三项匹配,即匹配沃尔玛和家得宝,因此明显得分为0 我想获得cmp_列表中得分>0.5的所有项目的列表 cmp_list = ['Walmart', 'Walmart super'

我有一个公司列表(cmp_列表),其中我使用一些自定义算法将每个值与另一个值进行比较,并得出了所有分数的这个矩阵(分数矩阵)。如果您通读矩阵,您将看到第1行和第1列为1 bcoz,第一项为cmp_,列表与自身匹配,类似地,第3行和第3列为1。现在第1行col3为0 bcoz,cmp列表中的第一项与cmp_列表中的第三项匹配,即匹配沃尔玛和家得宝,因此明显得分为0

我想获得cmp_列表中得分>0.5的所有项目的列表

cmp_list =    ['Walmart', 'Walmart super', 'Home Depot', 'Sears', 'Home Depot Center', 'Home Depot']
得分矩阵:

[[1.         1.         0.         0.         0.         0.        ]
 [1.         1.         0.         0.         0.         0.        ]
 [0.         0.         1.         0.         0.66666667 0.81649658]
 [0.         0.         0.         1.         0.         0.        ]
 [0.         0.         0.66666667 0.         1.         0.81649658]
 [0.         0.         0.81649658 0.         0.81649658 1.        ]]
cmp_list_1 = ['Walmart', 'Walmart super']
cmp_list_2 = ['Home Depot', 'Home Depot Center', 'Home Depot']
if(np.count_nonzero(score_matrix - np.diag(np.diagonal(score_matrix)))) > 0:
                rowsi, cols = np.nonzero(score_matrix)
                for it in zip(rowsi,cols):
                        if np.where(score_matrix[it[0]][it[1]] >= 0.5):
所需输出:

[[1.         1.         0.         0.         0.         0.        ]
 [1.         1.         0.         0.         0.         0.        ]
 [0.         0.         1.         0.         0.66666667 0.81649658]
 [0.         0.         0.         1.         0.         0.        ]
 [0.         0.         0.66666667 0.         1.         0.81649658]
 [0.         0.         0.81649658 0.         0.81649658 1.        ]]
cmp_list_1 = ['Walmart', 'Walmart super']
cmp_list_2 = ['Home Depot', 'Home Depot Center', 'Home Depot']
if(np.count_nonzero(score_matrix - np.diag(np.diagonal(score_matrix)))) > 0:
                rowsi, cols = np.nonzero(score_matrix)
                for it in zip(rowsi,cols):
                        if np.where(score_matrix[it[0]][it[1]] >= 0.5):
我曾尝试使用嵌套for循环来实现这一点,但我正在寻找更具python风格和简洁性的方法来实现这一点:

到目前为止我的代码:

[[1.         1.         0.         0.         0.         0.        ]
 [1.         1.         0.         0.         0.         0.        ]
 [0.         0.         1.         0.         0.66666667 0.81649658]
 [0.         0.         0.         1.         0.         0.        ]
 [0.         0.         0.66666667 0.         1.         0.81649658]
 [0.         0.         0.81649658 0.         0.81649658 1.        ]]
cmp_list_1 = ['Walmart', 'Walmart super']
cmp_list_2 = ['Home Depot', 'Home Depot Center', 'Home Depot']
if(np.count_nonzero(score_matrix - np.diag(np.diagonal(score_matrix)))) > 0:
                rowsi, cols = np.nonzero(score_matrix)
                for it in zip(rowsi,cols):
                        if np.where(score_matrix[it[0]][it[1]] >= 0.5):
另一种方式:

def relation(x,dat):
    k = sorted(np.unique(np.r_[dat[1][np.in1d(dat[0],x)],x,dat[0][np.in1d(dat[1],x)]]))
    if k==x: return k
    else: return relation(k,dat)

def rel(a,cmp_list):
    a[np.diag_indices_from(a)] = 0
    mat = np.where(a>0.5)
    ind = list(np.unique(mat[0]))
    w = []
    while ind:
        k = relation([ind[0]],mat)
        w.append(list(np.array(cmp_list)[k]))
        if any(np.in1d(ind,k)):
            ind = list(np.array(ind)[~np.in1d(ind,k)])
        if len(ind)>0:
            del ind[0]
    return w

rel(score_matrix,cmp_list)
[['Walmart', 'Walmart super'],
 ['Home Depot', 'Home Depot Center', 'Home Depot']]

您是如何从发布的代码中获取cmp_列表_1和cmp_列表_2的?@min2bro,根据您对分数矩阵的解释,分数矩阵中的值只能是0和1,所有1都在对角线上。但是如何显示0.66666 7这样的值呢?@fountainhead,所有的值都出现在对角线上,因为这是相同元素的比较,所以行、列在对角线上是相同的。不,我只是举例说明了比较是如何工作的,但它可以是0到1之间的任何东西。在rel(a,cmp_列表)中,cmp_列表是什么?这是你写的:
cmp_列表=['Walmart','Walmart super','Home Depot','Sears','Home Depot Center','Home Depot']
a是得分矩阵