2016-10-03 10 views
2

edgesの文字列をnum38を使用してnodesのインデックスで表現したいと考えています。文字列の行列を別の配列のインデックスで表現する

nodes = np.array('A B C D E'.split()) 
edges = np.array([['A', 'B'], 
        ['A', 'C'], 
        ['B', 'C'], 
        ['B', 'E'], 
        ['D', 'E']]) 

所望の出力

np.array([[0, 1], 
      [0, 2], 
      [1, 2], 
      [1, 4], 
      [3, 4]]) 

非最適化された明確な方法dictを作成し、dictの値で文字列を置換することです。

答えて

2

あなたがnp.searchsorted使用することができます - サンプル実行

np.searchsorted(nodes,edges) 

を -

In [17]: nodes 
Out[17]: 
array(['A', 'B', 'C', 'D', 'E'], 
     dtype='|S1') 

In [18]: edges 
Out[18]: 
array([['A', 'B'], 
     ['A', 'C'], 
     ['B', 'C'], 
     ['B', 'E'], 
     ['D', 'E']], 
     dtype='|S1') 

In [19]: np.searchsorted(nodes,edges) 
Out[19]: 
array([[0, 1], 
     [0, 2], 
     [1, 2], 
     [1, 4], 
     [3, 4]]) 

nodesがソートされていない場合、我々はサンプルの実行の修正版に示したように、それをsorter引数を使用する必要があります -

In [44]: nodes 
Out[44]: 
array(['E', 'D', 'C', 'B', 'A'], 
     dtype='|S1') 

In [45]: edges 
Out[45]: 
array([['A', 'B'], 
     ['A', 'C'], 
     ['B', 'C'], 
     ['B', 'E'], 
     ['D', 'E']], 
     dtype='|S1') 

In [46]: sidx = nodes.argsort() 

In [47]: sidx[np.searchsorted(nodes,edges,sorter=sidx)] 
Out[47]: 
array([[4, 3], 
     [4, 2], 
     [3, 2], 
     [3, 0], 
     [1, 0]]) 
関連する問題