可以numpy.Tensordot或ufunc取代这个嵌套的for循环?



注意:我知道这与使用numpy非常相似。tensordot替换一个嵌套循环,只是我们正在处理的实际实例似乎不同(我需要二次形式计算),我不够聪明,无法推断那里的讨论,因此问这个问题。

目的:用矩阵计算或/和通用函数代替for循环,提高计算速度。

问题:

#Toy example
def A(a):
return [[a,1,1],[1,1,1],[1,1,a**2]]
val = 0
for a in range(1,5):
for x in [ [1,1,1], [2,2,2], [3,3,3] ]:
val +=np.exp(-1* np.dot(np.dot(x,A(a)), x))  
print(val)

在实际实现中,我有x作为9维向量,范围超过10**9迭代,范围超过(50)**2迭代,它需要永远使用这个for循环?有什么建议吗?我觉得张点似乎是最有可能的,但我总是得不到我想要的结果,因此问。因为我是一个真正的初学者,如果你能写出一个我可以直接应用的示例代码,那就真的很有帮助了……提前谢谢。

补充:经过进一步的研究,似乎并不一定是np.tensordot()是最快的,所以除了for循环之外的任何解决方案都是受欢迎的。使用np。和两次,np的组合。点和np。等)。多亏了@hpaulj,我现在知道如何消除z循环,但我真的想解决一个循环…

In [155]: a=1
...: val=0
In [156]: for x in [ [1,1,1], [2,2,2], [3,3,3] ]:
...:    val +=np.exp( np.dot(np.dot(x,A(a)), x))
...: 
In [157]: val
Out[157]: 1.5060973145850306e+35

部分可替换为

In [158]: X = np.array([ [1,1,1], [2,2,2], [3,3,3] ])
In [159]: np.exp(np.einsum('ki,ij,kj->k',X,A(a),X)).sum()
Out[159]: 1.5060973145850306e+35

最新更新