索引操作有什么好处呢,第一个是可以消除不必要的循环,我们来看一个样例:
a = []
data = pd.read_csv(f, header=None)
for i in range(len(data[0])):
a.append(float(round(float(data[0][i]))))
可以看出这仅仅是一个赋值操作,对a中每个元素的赋值之间没有依赖关系,所以可以用索引去掉循环,提高速度:
a = []
data = pd.read_csv(f, header=None)
a[:] = round(data[0][:].astype(float))
等号左右两边的索引必须是一一对应关系,即a的所有对应data[0]的所有。
我们再来看一个复杂一点的样例(注意seq_是numpy数组,因此可以用[:, 20]来进行索引,如果是普通的python数组就只能使用[:][20]):
seq_[:, 20] = pt.sqrt(pt.sum((node_pos[:,0] - node_pos[:,4])**2, dim=1))
等号右边要计算一个空间距离:先做差、再平方、再加和、最后开方。等号两边同样保证了一一对应。
最后来看一个更复杂的样例:
nho_attr[:] = pt.sqrt(pt.sum((node_pos[edge_nho[0][:], 0] - node_pos[edge_nho[1][:], 3])**2, dim=1))
等号右边同样计算一个空间距离;在上一个样例中我们直接用“:”作node_pos的索引,而在这里我们用edge_nho[0][:]作为node_pos的索引。只要我们保证edge_nho[0][:]和nho_attr[:]是一一对应的,就可以保证经过edge_nho[0][:]索引的node_pos可以对nho_attr赋值。