我有一组节点(存储为nodes = np.array([[x1,y1],[x2,y2],etc]])
)和连接节点的元素。每个元素都是两个节点索引的数组。
所以[0,3]是连接节点0和3的元素。
如何返回连接到给定节点索引的所有节点索引的列表?
例如,如果:
element = np.array( [ [3,2] , [1,4] , [1,3] ])
print findConnectedNodes(3)
应打印[2,1]
答案 0 :(得分:3)
这是一种矢量化方法 -
def findConnectedNodes(a, node_id = 3):
b = a[(a == node_id).any(1)]
return b[b!=node_id]
样品运行 -
In [40]: element
Out[40]:
array([[3, 2],
[1, 4],
[1, 3]])
In [41]: findConnectedNodes(element, node_id=3)
Out[41]: array([2, 1])
In [42]: findConnectedNodes(element, node_id=1)
Out[42]: array([4, 3])
In [43]: findConnectedNodes(element, node_id=2)
Out[43]: array([3])
为了提高性能,我们可以使用切片来获得成对节点的这种2列输入数组的b
。此外,我们可以在这里使用更多的布尔掩码。因此,我们还有两种方法,比如 -
def findConnectedNodes_v2(a, node_id = 3):
b = a[(a[:,0] == node_id) | (a[:,1] == node_id)]
return b[b!=node_id]
def findConnectedNodes_v3(a, node_id = 3):
mask2D = a == node_id
mask1D = mask2D[:,0] | mask2D[:,1]
return a[mask1D][~mask2D[mask1D]]
答案 1 :(得分:1)
使用numpy,您可以遍历所有元素并返回包含目标节点的元素。然后创建一组这些数字并从该集合中删除目标节点,例如
def findconnected_nodes(a, element):
return np.setdiff1d(np.unique([i for i in element if a in i]), a)
修改
比较两种有效的绩效解决方案:
element = np.random.randint(1,10,(10000, 2))
a = 2
%timeit findConnectedNodes(a, element)
10个循环,最佳3:每循环51.9 ms
%timeit findconnected_nodes(a, element)
100个循环,最佳3:每循环16.6 ms
答案 2 :(得分:0)
这是一个有效的解决方案:
managedObjectContext
它的工作原理是获取具有我们正在寻找的节点的所有列表并展平它们。然后,它将展平列表转换为一个集合以删除重复项,最后删除节点lookUp节点。
答案 3 :(得分:-1)
如果您正在寻找需要的功能:
data = np.array([[3,2], [1,4], [1,3]])
并返回:
[2, 1]
你可以:
res = []
matches = d[(d == 3).any(axis = 1)]
for pair in matches:
for node in pair:
if (node != 3):
res.append(node)
或简单地说:
matches = data[(data == 3).any(axis = 1)]
[node for pair in matches for node in pair if node != 3]