2014-01-30 4 views
3

튜플을 키와 해당 값으로 포함하는 매우 큰 사전이 있습니다. 이 사전은 단어 동시 발생 벡터가있는 인접성 행렬을 나타냅니다. 예를 들어 'work'는 '경험'으로 16 번 나타나고 'work'는 'services'와 함께 15 번 나타납니다. 이것이 선호하는 저장 방법인지 아닌지는 또 다른 문제입니다. (가지고있는 방대한 양의 데이터로 중첩 된 사전은 순행을위한 악몽이되었습니다.)하지만 지금 당장 가지고있는 것입니다.튜플 사전을 numpy 행렬로 변환

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

그 결과는 다음 좋았어요,하지만 내 질문 : 이전 게시물에

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

덕분에, 나는 단지이 방법을 사용하여 NetworkX 간단한 이진 인접 행렬을 할 수있었습니다

array([[ 0., 16., 25., 0.], 
     [ 16., 0., 1., 0.], 
     [ 25., 1., 0., 1.], 
     [ 10., 0., 0., 0.] 
     ...) 
: 나는 결과가이 라인을 따라 뭔가를 보일 것이다 것이다 그래야, 행렬의 값으로의 동시 발생 값을 사용하여 인접 행렬로 주파수를 변환해야 할 것입니다

이것이 이전 게시물과 유사하다면 사과하지만 NetworkX에서 사용할 수있는 행렬로 이러한 튜플을 변환하는 올바른 방법을 찾을 수 없습니다. 나는 numpy를 사용할 것이라고 가정하지만, 이와 같은 메소드에 대한 문서를 찾을 수는 없습니다. 사전에

감사합니다,

당신은 정수로 튜플에있는 단어를 매핑하는 사전을 만들려면 주파수의 키에 튜플을 분석 한 다음 치수 NXN 곳의 NumPy와 배열을 만들 수

답변

4

This answer이 도움이 될 수 있습니다. 샘플 데이터로 :

>>> 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]]) 
+0

감사합니다. 너는 나를 좌우로 돕고있어. –

1

n은 귀하가 가지고있는 단어의 총 개수이며, 마지막으로 귀하의 빈도 사전을 사용하여 해당 배열을 채 웁니다.

관련 문제