2016-03-27 23 views
0

Ben süper süper hızlı olan bir nearest neighbors bir şey yapmaya çalışıyorum. Şu anda, S = set(G.neighbors(node)) ve S = set(G.neighbors(node)) arasındaki tüm yineleme işlemlerini networkx kullanıyorum, bu da iyi çalışıyor ancak indeksleme ve veri yapılarının avantajlarından faydalanmak istiyorum. Mümkün olduğunda yinelemekten uzaklaşmak isterim.np.where pd.DataFrame'de sıfır olmayan belirtiler sözlüğü için

Ben sonuçta anahtar root_node ve değer bir sözlük nesne ile yukarı bitirmek istiyorum düğüm (root_node dahil değil) komşuları

İşte benim grafiği ve DF_adj komşuluk matrisi şu şekilde görünür bir dizi:

(array([ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 
     3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 
     8, 9, 9, 10, 10]), array([ 0, 1, 3, 4, 5, 7, 0, 1, 2, 3, 4, 6, 8, 9, 10, 1, 2, 
     0, 1, 3, 0, 1, 4, 0, 5, 6, 1, 5, 6, 0, 7, 8, 1, 7, 
     8, 1, 9, 1, 10])) 
: Ben np.where(DF_adj == 1) yaptığınızda enter image description here

çıktı benziyor 2 diziler isedışarı bu İşaretli ancak tamamen Python pandas: select columns with all zero entries in dataframe

def neighbors(DF_adj): 
    D_node_neighbors = defaultdict(set) 
    DF_indexer = DF_adj.fillna(False).astype(bool) #Don't need this for my matrix but could be useful for non-binary matrices if someones needs it 
    for node in DF_adj.columns: 
     D_node_neighbors[node] = set(DF_adj.index[np.where(DF_adj[node] == 1)]) 
     D_node_neighbors[node].remove(node) 
    return(D_node_neighbors) 

nasıl çıktı bu tür almak için tüm pd.DataFrame üzerinde np.where kullanabilirsiniz bana yardım etmedi?

defaultdict(set, 
      {'a': {'b', 'd', 'e', 'f', 'h'}, 
      'b': {'a', 'c', 'd', 'e', 'g', 'i', 'j', 'k'}, 
      'c': {'b'}, 
      'd': {'a', 'b'}, 
      'e': {'a', 'b'}, 
      'f': {'a', 'g'}, 
      'g': {'b', 'f'}, 
      'h': {'a', 'i'}, 
      'i': {'b', 'h'}, 
      'j': {'b'}, 
      'k': {'b'}}) 
+0

, 'np.where()' olacak dönüşü olmayan edemez Sen sözlük. – Goyo

+0

Biliyorum, ancak daha sonra –

cevap

1

Bunu anlama dict ile yapabilirsiniz. df ise:

a b c d e f g h i j k 
a 1 1 0 1 1 1 0 1 0 0 0 
b 1 1 1 1 1 0 1 0 1 1 1 
c 0 1 1 0 0 0 0 0 0 0 0 
d 1 1 0 1 0 0 0 0 0 0 0 
e 1 1 0 0 1 0 0 0 0 0 0 
f 1 0 0 0 0 1 1 0 0 0 0 
g 0 1 0 0 0 1 1 0 0 0 0 
h 1 0 0 0 0 0 0 1 1 0 0 
i 0 1 0 0 0 0 0 1 1 0 0 
j 0 1 0 0 0 0 0 0 0 1 0 
k 0 1 0 0 0 0 0 0 0 0 1 

Sonra {i:{ j for j in df.index if df.ix[i,j] and i!= j} for i in df.index } geçerli:

{'j': {'b'}, 
'e': {'a', 'b'}, 
'g': {'b', 'f'}, 
'k': {'b'}, 
'a': {'b', 'd', 'e', 'f', 'h'}, 
'c': {'b'}, 
'i': {'b', 'h'}, 
'f': {'a', 'g'}, 
'b': {'a', 'c', 'd', 'e', 'g', 'i', 'j', 'k'}, 
'd': {'a', 'b'}, 
'h': {'a', 'i'}} 

Veya 2X hızlı:

s=df.index   
d=collections.defaultdict(set) 
for (k,v) in zip(*where(df==1)): 
    if k!=v: 
     d[s[k]].add(s[v]) 
+0

'1 döngüsünde tüm sütunlar boyunca yinelemeyi düşündüğüm daha etkili bir yol olabilir, döngü başına 0:1 döngüsünde en iyi 3: 4.75 sn, döngü başına en iyi 3: 2.41 s en hızlı olanı (nx.graph) ile iki kat daha hızlıydı. Teşekkürler adam bu gerçekten yararlı –

İlgili konular