итерация матрицы и получение всех значений со счетом gt than - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть список компаний (cmp_list), в котором я сравниваю каждое из значений с другим, используя какой-то собственный алгоритм, и придумала эту матрицу (Score Matrix) для всех баллов.если вы прочитаете матрицу, вы увидите, что row1 и col1 равны 1 bcoz, первый элемент cmp_list сопоставлен сам с собой, и аналогично row3 и col3 равен 1. Теперь row1, col3 равен 0, потому что первый элемент в cmp-list сопоставлен с третьимэлемент в cmp_list, т.е. совпадающий с Walmart и Home Depot, поэтому, очевидно, счет равен 0.

Я хочу получить список всех элементов в cmp_list, чей счет> 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']

Я пытался сделать это, используя вложенный цикл for, но я ищу что-то более Pythonic икратко для этого:

Мой код пока:

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 Ответ

0 голосов
/ 20 февраля 2019
import numpy as np


a = score_matrix
a[np.diag_indices_from(a)] = 0
set([tuple(sorted(np.array(cmp_list)[(np.c_[[i],np.where(j>0.5)])][0]))for i,j in enumerate(a) if any(j>0.5)])

{('Home Depot', 'Home Depot', 'Home Depot Center'),
 ('Walmart', 'Walmart super')}

Другой способ:

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']]
...