在论文源码中看到一种没用过的np.array 矩阵的操作,记录下来,以便后续的学习。
废话不多说直接上源码:
#代码摘抄自ST_GCN源码中的graph.py
import numpy as np
def get_hop_distance(num_node, edge, max_hop=1):
A = np.zeros((num_node, num_node))
for i, j in edge:
A[j, i] = 1
A[i, j] = 1
# compute hop steps
# np.inf (e.g. infinity)
hop_dis = np.zeros((num_node, num_node)) + np.inf
transfer_mat = [np.linalg.matrix_power(A, d) for d in range(max_hop + 1)]
arrive_mat = (np.stack(transfer_mat) > 0)
for d in range(max_hop, -1, -1):
hop_dis[arrive_mat[d]] = d
return hop_dis
截取里面的一小节
#max_hop=1
#假设 arrive_mat=array([[[True,True],
# [True,False]],
# [[True,False],
# [True,False]]])
# hop_dis=array([[inf,inf],[inf,inf]])
# inf是infinity的缩写,表示无穷大
for d in range(max_hop, -1, -1):
hop_dis[arrive_mat[d]] = d
#结果为:
# hop_dis=array([0,0],
# [0,inf])
hop_dis的变化过程如下:
hop_dis=array([[inf,inf],[inf,inf]]) —> hop_dis=array([[0,0],[0,inf]])
其实可以分开为两部分,
- hop_dis[ arrive_mat[1] ] =1
hop_dis=array([[nf,inf],[inf,inf]]) —> hop_dis=array([[1,inf],[1,inf]])
2)hop_dis[ arrive_mat[0] ] =0
hop_dis=array([[1,inf],[1,inf]])—> hop_dis=array([[0,0],[0,inf]])
矩阵hop_dis中的元素根据arrive_mat中对应位置的bool值进行变化,若对应位置为True则执行赋值操作。
arrive_mat[0][0][0]=True ,则当d=0时,hop_dis[0][0]=0