0

グラフのどのエッジが双方向であるかを調べようとしています。各行はエッジです。開始ノード A ごとに、対応する各終了ノード B を、ノード A が終了点としてある場合に検索しています。

for ending_point_B in nodeA:
    nodeA in ending_points_of_B

df['S'] で繰り返されるエントリを無視します。この検索を最適化するにはどうすればよいですか? groupby に沿った何かを疑っています。この方法では、実際のグラフには時間がかかりすぎます。

ありがとうございました

from pandas import *

def missing_node(node):
    set1 = set(df[df.E == node].S.values)
    set2 = set(df.E[df.S == node].values)
    return list(set1.difference(set2))

x = [1,1,2,2,3]
y = [2,3,1,3,1]

df = DataFrame([x,y]).T
df.columns = ['S','E'] #Start & End

df['Missing'] = df.S.apply(missing_node)

df:

   S  E Missing
0  1  2      []
1  1  3      []
2  2  1      []
3  2  3      []
4  3  1     [2]
4

2 に答える 2

0

Pandas は素晴らしいですが、ここで必要かどうかはわかりません。次のようなものは、双方向ではないリンクを提供するはずです:

x = [1,1,2,2,3]
y = [2,3,1,3,1]

fwd = set( zip(x,y) )
rev = set( zip(y,x) )
print ' not bi: ', fwd.difference(rev)

これは以下を返します:

Bi ではない: set([(2, 3)])

于 2012-06-21T12:22:08.997 に答える
0

私があなたの問題を正しく理解していれば、双方向ではないすべてのノード ペアを見つける必要があります。上記の例では、そのようなノードのペアは 2 と 3 だけです。これを考えると、次のことができます。

In [1]: df['is_bi'] = df.index.map(lambda x: np.any(map(lambda y: np.all(y), df.ix[x][['E', 'S']].values == df.values)))
In [2]: df
Out[2]:
   S  E  is_bi
0  1  2   True
1  1  3   True
2  2  1   True
3  2  3  False
4  3  1   True

したがってdf[-df.is_bi]、双方向ではないノードのすべてのペアが得られます。

In [3]: df[-df.is_bi][['S', 'E']]
Out[3]: 
   S  E
3  2  3

私はこれを過度に複雑にしていると感じています.pandasネイティブ関数でこれを行う方法が必要ですが、上記の解決策はうまくいきます.

于 2012-06-21T03:57:18.193 に答える