Arrays 通过字符串在另一个数组中的索引表示字符串矩阵

Arrays 通过字符串在另一个数组中的索引表示字符串矩阵,arrays,numpy,matrix,Arrays,Numpy,Matrix,我想使用numpy通过节点中的索引来表示边中的字符串 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],

我想使用numpy通过
节点中的索引来表示
边中的字符串

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
的值替换字符串-

样本运行-

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]])
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]])
如果
节点
未排序,我们需要使用
sorter
参数,如示例运行的修改版本所示-

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