【发布时间】:2017-04-05 20:25:14
【问题描述】:
我有一个表示有向图的数据集。第一列是源节点,第二列是目标节点,我们可以忽略第三列(本质上是一个权重)。比如:
0 1 3
0 13 1
0 37 1
0 51 1
0 438481 1
1 0 3
1 4 354
1 10 2602
1 11 2689
1 12 1
1 18 345
1 19 311
1 23 1
1 24 366
...
我想做的是为每个节点附加出度。例如,如果我只是添加节点 0 的出度,我会:
0 1 3 5
0 13 1 5
0 37 1 5
0 51 1 5
0 438481 1 5
1 0 3
...
我有一些代码可以做到这一点,但它非常慢,因为我使用的是 for 循环:
import numpy as np
def save_degrees(X):
new_col = np.zeros(X.shape[0], dtype=np.int)
X = np.column_stack((X, new_col))
node_ids, degrees = np.unique(X[:, 0], return_counts=True)
# This is the slow part.
for node_id, deg in zip(node_ids, degrees):
indices = X[:, 0] == node_id
X[:, -1][indices] = deg
return X
train_X = np.load('data/train_X.npy')
train_X = save_degrees(train_X)
np.save('data/train_X_degrees.npy', train_X)
有没有更有效的方法来构建这种数据结构?
【问题讨论】:
-
是否总是对第一列进行排序?
-
我相信它是排序的,但如果有必要我可以排序。
-
发布的解决方案是否适合您?
-
@Divakar,是的。公认的答案有效,在包含 3,348,026 个元素的数据集上非常快,并且只需要很少的额外代码。