Numpy矩阵通常更快,因为它们知道它们的维数和条目类型。在
在您的特定情况下,由于已经创建了arc_weight和node_degrees矩阵,因此可以直接从arc_weight创建矩阵,然后替换对角线:A = np.matrix(arc_matrix)
np.fill_diagonal(A, node_degree)
另一个选择是用一个函数来替换双循环,该函数在每个位置上放置正确的元素,并从该函数创建一个矩阵:
^{pr2}$
根据经验,使用numpy,你必须不惜一切代价避免循环。第一种方法应该更快,但你应该分析一下这两种方法,看看什么对你有用。你还应该考虑到你似乎在复制内存中的数据集,所以如果它真的很大,你可能会遇到麻烦。最好的办法是直接创建矩阵,避免弧重和节点度。在
编辑:列表理解和numpy矩阵创建之间的一些简单时间比较。因为我不知道你的弧长权和节点度是如何定义的,所以我只做了两个随机函数。如果函数有条件,numpy.fromfunction似乎会有点抱怨,所以我分两步构造矩阵。在import numpy as np
def arc_weight(a,b):
return a+b
def node_degree(a):
return a*a
def create_as_list(N):
return [[arc_weight(c,r) if c!=r else node_degree(c) for c in xrange(N)] for r in xrange(N)]
def create_as_numpy(N):
A = np.fromfunction(arc_weight, (N,N))
np.fill_diagonal(A, node_degree(np.arange(N)))
return A
这里是N=2000的计时:time A = create_as_list(2000)
CPU times: user 839 ms, sys: 16.5 ms, total: 856 ms
Wall time: 845 ms
time A = create_as_numpy(2000)
CPU times: user 83.1 ms, sys: 12.9 ms, total: 96 ms
Wall time: 95.3 ms