Построить матрицу присваивания - Python - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть два списка элемента

a = [1,2,3,2,3,1,1,1,1,1]
b = [3,1,2,1,2,3,3,3,3,3]

, и я пытаюсь однозначно сопоставить элемент от a до b, мой ожидаемый результат такой:

1: 3
2: 1
3: 2

Итак, япопытался построить матрицу присваивания и затем использовать scipy.linear_sum_assignment

a = [1,2,3,2,3,1,1,1,1,1]
b = [3,1,2,1,2,3,3,3,3,3]

total_true = np.unique(a)
total_pred = np.unique(b)

matrix = np.zeros(shape=(len(total_pred),
                         len(total_true)
                         )
                  )

for n, i in enumerate(total_true):
    for m, j in enumerate(total_pred):
        matrix[n, m] = sum(1 for item in b if item==(i))

Я ожидал, что матрица будет:

  1 2 3
1 0 2 0
2 0 0 2
3 6 0 0

Но вывод:

[[2. 2. 2.]
 [2. 2. 2.]
 [6. 6. 6.]]

Какую ошибку я сделал здесь?Большое спасибо

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Эта строка:

matrix[n, m] = sum(1 for item in b if item==(i))

считает случаи i в b и сохраняет результат в matrix[n, m].Каждая ячейка матрицы будет содержать либо число 1 в b (т.е. 2), либо число 2 в b (т.е. 2), либо число 3 в b (т.е. 6).Обратите внимание, что это значение полностью не зависит от j, что означает, что значения в одной строке всегда будут одинаковыми.

Чтобы принять во внимание j, попробуйте заменить строку на:

matrix[n, m] = sum(1 for x, y in zip(a, b) if (x, y) == (j, i))
0 голосов
/ 12 декабря 2018

В случае ожидаемого результата, поскольку, как мы определяем матрицу как a(i, j) с i, это индекс строки, а j является индексом столбца.Глядя на a(3,1) в вашей матрице, результат равен 6, что означает, что (3,1) комбинация соответствует 6 раз, причем 3 - от b, а 1 - от a.Мы можем найти все совпадения из списка 2.

matches = [tuple([x, y]) for x,y in zip(b, a)]

Затем мы можем найти количество совпадений определенной комбинации, например, (3, 1).

result = matches.count((3,1)) 
0 голосов
/ 12 декабря 2018

Вам даже не нужно обрабатывать это Pandas.попробуйте использовать zip и dict:

In [42]: a = [1,2,3,2,3,1,1,1,1,1]
    ...: b = [3,1,2,1,2,3,3,3,3,3]
    ...: 

In [43]: c =zip(a,b)

In [44]: dict(c)
Out[44]: {1: 3, 2: 1, 3: 2}

ОБНОВЛЕНИЕ , как указано в OP, если нам нужно сохранить все значения с одним и тем же ключом, мы можем использовать defaultdict:

In [58]: from collections import defaultdict

In [59]: d = defaultdict(list)

In [60]: for k,v in c:
    ...:     d[k].append(v)
    ...:     

In [61]: d
Out[61]: defaultdict(list, {1: [3, 3, 3, 3, 3, 3], 2: [1, 1], 3: [2, 2]})
...