создать матрицу со ссылками

1

Я создаю модель, чтобы увидеть, как элемент кортежа перебирается на другие кортежи в списке.

Для примера

[(12,a), (12,c), (12,d), (14,e), (14,a), (13, a), (13,b), (13,d), (13,c), (16,b),(16,b) ]

Цель здесь - совместить, например, 12 в кортеже 1-12 в кортеже 2, и если они совпадают с подсчетом. Матч считается "Ссылка". Мне нужно поместить количество этих ссылок в матрицу.

Например:

   a  b  c  d  e 
a  0     1  2  2
b    0
c  1    0   0
d    0     0
e  1           0

У меня есть следующий код

from collections import defaultdict

import pandas as pd import numpy как np из импортных комбинаций itertools из коллекций import Counter import numpy as np import scipy.sparse as ss np.seterr(divide = 'ignore', invalid = 'ignore')

данные испытаний

year= [2001, 2002, 2002, 2005, 2002, 2004, 2001, 2001, 2002, 2003, 2003, 2002, 2004, 2005, 2003, 2004, 2005, 2004, 2004, 2002, 2001, 2001]
indviduals= [12, 23, 12, 24, 28,30, 15, 17, 18, 18, 19, 12, 15, 12, 12, 12, 15, 15, 15, 12, 12, 15, 200, 200]
employers= ['a', 'b', 'b','c', 'd', 'e', 'a', 'a', 'b', 'b', 'c', 'b', 'a', 'c', 'e', 'a', 'a', 'a', 'a', 'b', 'a', 'a', 'b']

employerEmployeeEdges=[]
for j in np.unique(year):
    """generates the count of employees per employer per year"""
    #print("year",j)
    d = dict.fromkeys(employers, ())
    cond_year = j
    for i,e,y in zip(indviduals, employers, year):
        if y == cond_year:
            d[e] = d[e] + (i,)

    #print(d, [len(v) for k, v in d.items()]) # if I want to print all the employers and employee per year 

    for k, v in d.items():
        if len(v)>1:
            """I am gonna have to ignore if there are no values for that specific employer. 
            Zero employees means nothing for that year"""
            #print(j,k)
            for item in v:
                #print(item, "item")
                #print(j, item, k)
                edges = (item, k)
                edges=edges
                #print(edges, type(edges))
                employerEmployeeEdges.append(edges) # create a list of employees employer edge for all years


print("employees employer edges", [i for i in employerEmployeeEdges]) # list of possible links between employee and employer 
employersNew=[i[1] for i in employerEmployeeEdges]
# print("dfd",employersNew)
n = len([i[1] for i in employerEmployeeEdges])
Q = np.zeros((n, n), dtype=int)

for firstLink in  employerEmployeeEdges:
    for secondLink in employerEmployeeEdges[1:]: #potential second link where the combination is possible. 
        if firstLink[0]==secondLink[0]:
            print(firstLink[1], secondLink[1])
# #             print(firstLink, secondLink)
# #             break
#         from_node, to_node=firstLink[1],secondLink[1] #check where did the employee go? 

#         indx, jdx= employersNew.index(from_node), employersNew[1:].index(to_node)

#         Q[indx, jdx]=0
#         print(Q)
# #print(len(employerEmployeeEdges))
# #print(Q)

Этот отпечаток не даст мне желаемого результата. Как бы я поместил количество ссылок на матрицу?

Кроме того, я хочу использовать Матрицу Q для вычисления вероятности следующим образом:

# P=np.empty((n,n))
# #print(P)
# for i in range(n):
#     #print(i)
#     P[i, :] = Q[i, :] / Q[i, :].sum()

# #print(P)
  • 0
    У вас есть проблемы с вашим кодом? Пожалуйста, опишите, какую помощь вы хотите.
  • 0
    Да, потому что когда я печатаю Q, я получаю все нули. Как добавить счет на эту матрицу?
Показать ещё 2 комментария
Теги:
numpy
matrix

1 ответ

0
Лучший ответ

Вы могли бы сделать что-то вроде этого:

employerEmployeeEdges= np.array([(12,'a'), (12,'c'), (12,'d'), (14,'e'), (14,'a'),
(13, 'a'), (13,'b'), (13,'d'), (13,'c'), (16,'b'),(16,'b') ])

unique_employee = np.unique(employerEmployeeEdges[:,1])
n_unique = len(unique_employee)

Q = np.zeros([n_unique,n_unique])

for n, employer_employee in enumerate(employerEmployeeEdges):
   #copy the array for the original o be intact
   eee = np.copy(employerEmployeeEdges)
   #sustitue the current tuple with a empty one to avoid self comparing
   eee[n] = (None,None)

   #get the index for the current employee, the one on the y axis
   employee_index = np.where(employer_employee[1] == unique_employee)

   #get the indexes where the the employees letter match
   eq_index = np.where(eee[:,0] == employer_employee[0])[0]
   eq_employee = eee[eq_index,1]

   #add at the final array Q by index
   for emp in eq_employee:

      emp_index = np.where(unique_employee == emp)
      Q[employee_index,emp_index]+= 1

print(Q)

Этот код дает следующий ответ:

[[0. 1. 2. 2. 1.]
 [1. 2. 1. 1. 0.]
 [2. 1. 0. 2. 0.]
 [2. 1. 2. 0. 0.]
 [1. 0. 0. 0. 0.]]

Имейте в виду, что Q [0,0] - это "a: a", а Q [-1, -1] - это "e: e",

  • 0
    Спасибо. Я проверю это и вернусь к вам
  • 0
    спасибо Гильерме Узеде за помощь. Это сработало

Ещё вопросы

Сообщество Overcoder
Наверх
Меню