Numba njit函数报错:无法统一float64与array(float64,1d,C)类型
Numba编译类型不匹配错误排查与解决
我尝试修改大量变量以解决问题,但均未奏效。以下是我的代码:
import numpy as np import matplotlib.pyplot as plt import math as mt from numba import njit N=1000 J=1 h=0.5 plt.rcParams['figure.dpi']=100 plt.xlabel('T', fontsize=14) ns=100000000 # 修正初始化:直接生成一维标量数组 s = np.random.choice([-1,1], size=N) E=0 M=0 for i in range(-1,N-1): E = E - J*(s[i]*s[i+1] + s[i]*s[i-1]) M = M + s[i] # 修正结果数组为一维空数组 Energy = np.empty(0) C = np.empty(0) Magne = np.empty(0) chi = np.empty(0) @njit def average(k, E, M, ns, x, Energy, C, Magne, chi, s): Ev = 0. Ev2 = 0. Mv = 0. Mv2 = 0. for z in range(1, ns+1): i = np.random.randint(-1, high=N-1) dE = 2*J*(s[i]*s[i+1] + s[i]*s[i-1]) dM = 2*h*s[i] pace = 1./(1 + mt.exp(k*(dE + dM))) # pace = min(1, mt.exp(-k*dE)) if np.random.random() < pace: s[i] = -s[i] E = E + dE M = M - dM/h if z > x: Ev = Ev + (E - h*M) Ev2 = Ev2 + (E - h*M)**2 Mv = Mv + M Mv2 = Mv2 + M**2 Ev = Ev/(ns - x) Ev2 = Ev2/(ns - x) varE = (Ev2 - Ev**2) Energy = np.append(Energy, Ev) C = np.append(C, varE*(k**2)) Mv = Mv/(ns - x) Mv2 = Mv2/(ns - x) varM = (Mv2 - Mv**2) Magne = np.append(Magne, Mv) chi = np.append(chi, varM*k) return E, M, Energy, C, s, Magne, chi b = np.arange(0.3, 1., 0.01) x = 0.75*ns for k in b: E, M, Energy, C, s, Magne, chi = average(k, E, M, ns, x, Energy, C, Magne, chi, s) plt.plot(b, Energy, '.', color='r', linestyle='--') plt.plot(b, C, '.', color='b', linestyle='--') plt.title('Energy and heat capacity') plt.legend(['E','C']) plt.show() plt.rcParams['figure.dpi']=100 plt.xlabel(r'$\beta$', fontsize=14) plt.plot(b, Magne, '.', linestyle='--', color='r') plt.plot(b, chi, '.', color='b', linestyle='--') plt.title('Magnetization and susceptibility') plt.legend(['M',r'$\chi$']) plt.show()
报错信息:
Cannot unify float64 and array(float64, 1d, C) for 'Mv2.3', defined at c:\users\usuario\documents\python scripts\ex13hw7.py (65) File "ex13hw7.py", line 65: def average(k , E, M, ns, x, Energy, C, Magne, chi, s): <source elided> if z>x: Ev=Ev+(E-h*M) ^ During: typing of assignment at c:\users\usuario\documents\python scripts\ex13hw7.py (65)
问题原因与解决:
核心问题:变量类型不匹配。原代码中
s被初始化为np.empty([N,0])(N行0列的二维数组),后续赋值后s[i]仍是数组而非标量,导致计算E和M时,这两个变量变成了数组类型。而average函数中Ev、Mv2等初始化为标量,当尝试将数组值累加到标量上时,Numba无法统一标量和数组的类型,触发报错。修复步骤:
- 修正
s的初始化:直接用np.random.choice([-1,1], size=N)生成一维标量数组,替代原有的空二维数组+循环赋值,确保s的每个元素都是标量。 - 调整结果数组初始化:将
Energy=np.empty([0,0])这类二维空数组改为np.empty(0),因为后续存储的是一维的统计结果。 - 验证
E和M的类型:修正s后,E和M会被计算为标量,在average函数中与Ev等标量变量累加时类型一致,Numba可正常编译。
- 修正
内容的提问来源于stack exchange,提问作者Molero 03
相关产品推荐
相关产品推荐

