使用numba进行三角运算时出错



我想使用numba实现一个函数来加速我的算法的执行速度。尽管如此,在执行我的代码时,我得到了一个对我来说完全无法理解的错误,我很难解决。尽管如此,我指出这是由于使用了cos和sin函数。

@njit
def Metropolis(lattice, times, BJ, energy):
spins = np.copy(lattice)
net_spins = np.zeros(times-1)
net_energy = np.zeros(times-1)
for t in range(0,times-1):
# 2. pick random point on array and flip spin
x = np.random.randint(0,N)
y = np.random.randint(0,N)
spin_i = spins[x,y] #initial spinx

spin_f_temp = np.random.choice(list, 1)
# compute change in energy

E_i = 0
E_f = 0
if x>0:
E_i = E_i - np.cos(spins[x-1,y]-spin_i)
E_f = E_f - np.cos(spins[x-1,y]-spin_f_temp)
if x<N-1:
E_i = E_i - np.cos(spins[x+1,y]-spin_i)
E_f = E_f - np.cos(spins[x+1,y]-spin_f_temp)
if y>0:
E_i = E_i - np.cos(spins[x,y-1]-spin_i)
E_f = E_f - np.cos(spins[x,y-1]-spin_f_temp)
if y<N-1:
E_i = E_i - np.cos(spins[x,y+1]-spin_i)
E_f = E_f - np.cos(spins[x,y+1]-spin_f_temp)

dE = E_f-E_i
if (dE>0)*(np.random.random() < np.exp(-BJ*dE)):
spins[x,y]=spin_f_temp
energy += dE
elif dE<=0:
spins[x,y]=spin_f_temp
energy += dE
net_spins[t] = spins.sum()
net_energy[t] = energy
return net_spins, net_energy, spins`
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot unify Literal[int](0) and array(float64, 1d, C) for 'E_f.5', defined at        C:UsersdemetAppDataLocalTempipykernel_257161172949613.py (22)
File "AppDataLocalTempipykernel_257161172949613.py", line 22:
<source missing, REPL/exec in use?>
During: typing of assignment at C:UsersdemetAppDataLocalTempipykernel_257161172949613.py   (22)
File "AppDataLocalTempipykernel_257161172949613.py", line 22:
<source missing, REPL/exec in use?>

list是一个外部定义的numpy数组。

提前谢谢你

我得到这个错误的原因是什么?我不明白为什么。

原因是您混合了数组和整数。从晶格中通过位置访问的自旋是整数,但是spin_f_temp值是一个长度为1的一维数组。因此,您可以通过从该数组中获取值来修复代码。

spin_f_temp = np.random.choice(spinlist, 1)[0]

请注意,我将全局变量list重命名为spinlist,因为为变量选择语言定义的名称是不好的做法。

进一步注意:如果这不是一个练习,但您确实希望将此代码用于您的研究,我建议使用现有的Ising-Model蒙特卡罗模拟。作为一名开发人员,你永远不想重新发明轮子,作为一名科学家,你总是乐于引用别人。

最新更新