有没有办法加快这些嵌套循环(拉普拉斯案例)Python?
Is there a way to speed up these nested loops (Laplacian case) Python?
我正在尝试加快函数 Gram 中的嵌套循环。
导致较大延迟的我的函数是拉普拉斯算子 (Abel),因为它需要为矩阵的每个单元格逐行计算列的范数。
abel = lambda x,y,t,p: np.exp(-np.abs(p) * np.linalg.norm(x-y))
def Gram(X,Y,function,t,p):
n = X.shape[0]
s = Y.shape[0]
K = np.zeros((n,s))
if function==abel:
for i in range(n):
for j in range(s):
K[i,j] = abel(X[i,:],Y[j,:],t,p)
else:
K = polynomial(X,Y,t,p)
return K
通过将指数部分排除在阿贝尔方程之外,我能够稍微加快函数的速度,然后将其应用于整个矩阵。
abel_2 = lambda x,y,t,p: np.linalg.norm(x-y)
(不要介意 t 和 p)。
def Gram_2(X,Y,function,t,p):
n = X.shape[0]
s = Y.shape[0]
K = np.zeros((n,s))
if function==abel_2:
for i in range(n):
for j in range(s):
K[i,j] = abel_2(X[i,:],Y[j,:],0,0)
K = np.exp(-abs(p)*K)
else:
K = polynomial(X,Y,t,p)
return K
时间减少了 50%,但是,我认为双循环(嵌套)仍然是一个主要问题。
有人可以帮忙吗?
谢谢!
基本上,与其通过循环从 Y[j,:]
中减去 X[i,:]
,不如选择 X[i,:]
并从所有 Y 中减去它会节省大量时间,然后在某个轴上应用范数!
在我的例子中是 axis=1
。
def Gram_10(X,Y,function,t,p):
n = X.shape[0]
s = Y.shape[0]
K = np.zeros((n,s))
if function==abel_2:
for i in range(n):
# it is important to put the correct slice (:s) , so the matrix provided by the norm goes
# to the right place in the function
K[i,:s] = np.linalg.norm(X[i,:]-Y,axis=1)
K = np.exp(-abs(p)*K)
else:
K = polynomial(X,Y,t,p)
return K
我正在尝试加快函数 Gram 中的嵌套循环。
导致较大延迟的我的函数是拉普拉斯算子 (Abel),因为它需要为矩阵的每个单元格逐行计算列的范数。
abel = lambda x,y,t,p: np.exp(-np.abs(p) * np.linalg.norm(x-y))
def Gram(X,Y,function,t,p):
n = X.shape[0]
s = Y.shape[0]
K = np.zeros((n,s))
if function==abel:
for i in range(n):
for j in range(s):
K[i,j] = abel(X[i,:],Y[j,:],t,p)
else:
K = polynomial(X,Y,t,p)
return K
通过将指数部分排除在阿贝尔方程之外,我能够稍微加快函数的速度,然后将其应用于整个矩阵。
abel_2 = lambda x,y,t,p: np.linalg.norm(x-y)
(不要介意 t 和 p)。
def Gram_2(X,Y,function,t,p):
n = X.shape[0]
s = Y.shape[0]
K = np.zeros((n,s))
if function==abel_2:
for i in range(n):
for j in range(s):
K[i,j] = abel_2(X[i,:],Y[j,:],0,0)
K = np.exp(-abs(p)*K)
else:
K = polynomial(X,Y,t,p)
return K
时间减少了 50%,但是,我认为双循环(嵌套)仍然是一个主要问题。 有人可以帮忙吗? 谢谢!
基本上,与其通过循环从 Y[j,:]
中减去 X[i,:]
,不如选择 X[i,:]
并从所有 Y 中减去它会节省大量时间,然后在某个轴上应用范数!
在我的例子中是 axis=1
。
def Gram_10(X,Y,function,t,p):
n = X.shape[0]
s = Y.shape[0]
K = np.zeros((n,s))
if function==abel_2:
for i in range(n):
# it is important to put the correct slice (:s) , so the matrix provided by the norm goes
# to the right place in the function
K[i,:s] = np.linalg.norm(X[i,:]-Y,axis=1)
K = np.exp(-abs(p)*K)
else:
K = polynomial(X,Y,t,p)
return K