gpt4 book ai didi

python - 使用 numpy 从边缘列表中累积 "neigborhood"的值

转载 作者:太空宇宙 更新时间:2023-11-03 10:56:49 25 4
gpt4 key购买 nike

我有一个无向网络,其中每个节点都可以是 k 类型之一。对于每个节点 i,我需要计算节点 i 具有的每种类型的邻居数。

现在我用边缘列表表示边缘,其中列是节点的索引。节点表示为 n x k 矩阵,其中每一列代表一种节点类型。如果节点的类型为 k,则第 k 列的值为 1,否则为 0。

这是我当前的代码,它是正确的,但是太慢了。

# example nodes and edges, both typically much longer
nodes = np.array([[0, 0, 1],
[0, 1, 0],
[1, 0, 0]])
edges = np.array([[0, 1],
[1, 2]])

neighbors = np.zeros_like(nodes)

for i, j in edges:
neighbors[i] += nodes[j]
neighbors[j] += nodes[i]

是否有一些聪明的 numpy 可以让我避免这个 for 循环?如果最好的方法是使用邻接矩阵,那也是可以接受的。

最佳答案

如果我正确理解你的问题,numpy_indexed包(免责声明:我是它的作者)对此有一个快速而优雅的解决方案:

# generate a random example graph
n_edges = 50
n_nodes = 10
n_types = 3
edges = np.random.randint(0, n_nodes, size=(n_edges, 2))
node_types = np.random.randint(0, 2, size=(n_nodes, n_types)).astype(np.bool)

# Note; this is for a directed graph
s, e = edges.T
# for undirected, add reversed edges
s, e = np.concatenate([edges, edges[:,::-1]], axis=0).T
import numpy_indexed as npi
node_idx, neighbor_type_count = npi.group_by(s).sum(node_types[e])

一般来说,图形操作或涉及交错数组的算法通常可以使用分组操作高效而优雅地表达。

关于python - 使用 numpy 从边缘列表中累积 "neigborhood"的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com