Convertir un diccionario de tuplas en una matriz numpy

Tengo un diccionario muy grande que contiene tuplas como claves y sus valores. Se supone que este diccionario representa una matriz de adyacencia con vectores de co-ocurrencia de palabras, por ejemplo, ‘trabajo’ aparece con ‘experiencia’ 16 veces y ‘trabajo’ aparece con ‘servicios’ 15 veces. Si este es el método de almacenamiento preferido o no, es otro problema (con la gran cantidad de datos que tengo, los diccionarios nesteds se convirtieron en una pesadilla para el cruce), pero es lo que tengo ahora.

Frequency:{ ('work', 'experience'): 16, ('work', 'services'): 25, ('must', 'services'): 15, ('data', 'services'): 10, ... ...} 

Gracias a una publicación anterior, he podido hacer una matriz de adyacencia binaria simple con NetworkX, simplemente utilizando esta metodología:

 A=Frequency.keys() networkx.Graph(A) 

Ese resultado fue excelente entonces, pero mi pregunta es qué tengo que hacer para convertir Frecuencia en una matriz de adyacencia utilizando su valor de co-ocurrencia como el valor en la matriz, de modo que el resultado se vería en la misma línea de esta :

 array([[ 0., 16., 25., 0.], [ 16., 0., 1., 0.], [ 25., 1., 0., 1.], [ 10., 0., 0., 0.] ...) 

Pido disculpas si esto es similar a las publicaciones anteriores, pero simplemente no puedo encontrar la forma correcta de convertir estas tuplas a una matriz que pueda usar en NetworkX. Supongo que usaría numpy, pero no puedo encontrar ninguna documentación para un método como este.

Gracias por adelantado,

Ron

Esta respuesta puede ser de ayuda. Con sus datos de muestra:

 >>> frequency = {('work', 'experience'): 16, ... ('work', 'services'): 25, ... ('must', 'services'): 15, ... ('data', 'services'): 10} >>> keys = np.array(frequency.keys()) >>> vals = np.array(frequency.values()) >>> keys array([['work', 'services'], ['must', 'services'], ['work', 'experience'], ['data', 'services']], dtype='|S10') >>> vals array([25, 15, 16, 10]) >>> unq_keys, key_idx = np.unique(keys, return_inverse=True) >>> key_idx = key_idx.reshape(-1, 2) >>> unq_keys array(['data', 'experience', 'must', 'services', 'work'], dtype='|S10') >>> key_idx array([[4, 3], [2, 3], [4, 1], [0, 3]]) >>> n = len(unq_keys) >>> adj = np.zeros((n, n) ,dtype=vals.dtype) >>> adj[key_idx[:,0], key_idx[: ,1]] = vals >>> adj array([[ 0, 0, 0, 10, 0], [ 0, 0, 0, 0, 0], [ 0, 0, 0, 15, 0], [ 0, 0, 0, 0, 0], [ 0, 16, 0, 25, 0]]) >>> adj += adj.T >>> adj array([[ 0, 0, 0, 10, 0], [ 0, 0, 0, 0, 16], [ 0, 0, 0, 15, 0], [10, 0, 15, 0, 25], [ 0, 16, 0, 25, 0]]) 

Puede crear un diccionario para asignar las palabras en sus tuplas a números enteros, analizar las tuplas en las teclas de su Frecuencia, y luego crear una matriz numpy de dimensión nxn donde n es el número total de palabras que tiene, y finalmente llenar esa matriz con su Dict de frecuencia