You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无法统一标量和数组的类型,触发报错。

  • 修复步骤:

    1. 修正s的初始化:直接用np.random.choice([-1,1], size=N)生成一维标量数组,替代原有的空二维数组+循环赋值,确保s的每个元素都是标量。
    2. 调整结果数组初始化:将Energy=np.empty([0,0])这类二维空数组改为np.empty(0),因为后续存储的是一维的统计结果。
    3. 验证E和M的类型:修正s后,E和M会被计算为标量,在average函数中与Ev等标量变量累加时类型一致,Numba可正常编译。

内容的提问来源于stack exchange,提问作者Molero 03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:28:26