在数组中对表示节点网络的数字进行Numpy排序

2024-05-23 20:42:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个数组,它表示一个节点网络,其中连接的节点被描述为“from nodes”和“to nodes”:

a = array([(1, 2), (2, 3), (3, 4), (4, 5), (2, 6), (6, 7), (7, 8), (2, 9),
       (9, 10), (10, 11), (2, 12), (12, 13), (13, 14), (13, 15), (14, 16)], 
      dtype=[('fnode', '<i4'), ('tnode', '<i4')])

a['fnode']
array([ 1,  2,  3,  4,  2,  6,  7,  2,  9, 10,  2, 12, 13, 13, 14])
a['tnode']
array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])

如何将“to nodes”组合到列表中,使它们共享相同的“from node”?在

我想要这种格式:

^{pr2}$

编辑

为了清楚起见,我希望没有“To nodes”(例如节点8)的“from nodes”与一个空列表相关联。在


Tags: tofrom网络node列表节点格式数组
3条回答

您可以使用itertools.groupby。在

定义数组:

A = np.array([(1, 2), (2, 3), (3, 4), (4, 5), (2, 6), (6, 7), (7, 8), (2, 9),
   (9, 10), (10, 11), (2, 12), (12, 13), (13, 14), (13, 15), (14, 16)], 
  dtype=[('fnode', '<i4'), ('tnode', '<i4')])

排序:

^{pr2}$

然后将其分组(我在这里将生成器转换为一个列表,以便您可以看到其结果):

^{3}$

然后您可以进行任何需要的后处理。在

例如,在本例中,您要的是更像[(k, map(lambda (a,b): b, v)) for k,v ...的内容。在

(请注意,对数组进行排序非常重要。groupby的操作方式与POSIXuniq相同,因为它只组合相邻的元素。要组合所有元素,请按与分组依据相同的键排序。)

如果你的目标还没有达到你的目标,那就用你的速度吧。那样的话,我建议使用熊猫图书馆。在

>>> pd.DataFrame(a).groupby('fnode').apply(lambda x: x['tnode'].values)
fnode
1                  [2]
2        [3, 6, 9, 12]
3                  [4]
4                  [5]
6                  [7]
7                  [8]
9                 [10]
10                [11]
12                [13]
13            [14, 15]
14                [16]
dtype: object

大型阵列上的定时信息:

^{pr2}$

使用collections.defaultdict

d = defaultdict(list)
map( lambda (k,v) : d[k].append(v), a)
print d
>> Out[40]: defaultdict(<type 'list'>, {1: [2], 2: [3, 6, 9, 12], 3: [4]
: [7], 7: [8], 9: [10], 10: [11], 12: [13], 13: [14, 15], 14: [16]})

相关问题 更多 >