两次调用一个函数会覆盖以前单独存储的结果

2024-10-01 11:39:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我的python脚本以一种我无法理解的方式运行。这是一个相当复杂的脚本,为了简单起见,我在这里将其最小化,希望在这里保留所有重要的特性

解决问题的方法:我尝试用一组公共参数来模拟几个实验曲线。首先,根据输入参数计算出两个函数SLD1和SLD2,用来确定实验曲线

Phi1, Phi2, SLD1, SLD2 = nr.Par(fit_params, Files, GFP, coher)

SLD1和SLD2的尺寸相同,但值不同。如上所述,我从SLD1和SLD2计算实验曲线,并将它们存储在数组的第5列(datax和datay)

for i in range(len(Files)):
   qexp, RRexp, RRerr, qres = np.loadtxt(Files[i], unpack=True, skiprows=24, usecols=(0,1,2,3))
   dataset = np.zeros(shape=(len(qexp),5))
   dataset[:,0:4] = np.column_stack((qexp*10, RRexp, RRerr, qres*10))
   data.append(dataset)

Phi1, Phi2, SLD1, SLD2 = nr.Par(fit_params, Files, GFP, coher)
datax = np.copy(data, order='K')
datay = np.copy(data, order='K')        
for i in range(len(Files)):
    q = data[i][:,0]
    datax[i][:,4] = np.copy(nr.NRcalc(q, SLD1[:,i,:],GFP))
    datay[i][:,4] = np.copy(nr.NRcalc(q, SLD2[:,i,:],GFP))
print(SLD2[:,1,:]- SLD1[:,1,:])
print(nr.NRcalc(data[1][:,0], SLD1[:,1,:], GFP)-nr.NRcalc(data[1][:,0], SLD2[:,1,:],GFP))
print(datax[1][:,4]-datay[1][:,4])

在我的程序概念中,用SLD1计算的实验曲线应该存储在datax[i][:,4]中,用SLD2计算的实验曲线应该存储在datay[i][:,4]中。但是,这两列是相同的!事实上

print(datax[1][:,4]-datay[1][:,4])

返回一个零数组。实际上,在计算数据y[i][:,4]时,我也在覆盖数据x[i][:,4]。我不明白的是为什么

 print(nr.NRcalc(data[1][:,0], SLD1[:,1,:], GFP)-nr.NRcalc(data[1][:,0], SLD2[:,1,:],GFP))

返回正确的值。我可能插入了太多的np.copy命令,希望解决这个问题,这似乎是一个不必要的数组链接。然而,这并没有改变任何输出。为了完整起见,我还发布了Nr.Calc函数:

 def NRcalc(q,SLDt,GFP):
   start = timeit.default_timer()
   RR = np.ndarray(shape=(len(q)))
   x = SLDt[:,0]
   for j in range(len(q)):
    k0 = np.complex256(q[j]/2.+np.sqrt(4*np.pi*GFP[6]+0j))
    k = np.complex256(np.sqrt(k0**2-4*np.pi*SLDt[:,1]+0j))
    rij = np.zeros(shape=(len(x),1),dtype=np.complex_)
    Rij = np.zeros(shape=(len(x),1),dtype=np.complex_)

    for i in range(len(x)):
        if (i == len(x)-1):
            rij[i] = (k0-k[i])/(k[i]+k0)

        elif (i < len(x)-1):
            rij[i] = (k[i+1]-k[i])/(k[i]+k[i+1])

        Rij[0] = rij[0]

        if (i>0):
            pp = np.exp(-2j*k[i-1]*(x[i]-x[i-1])) #Phase shift of reflected wave
            Rij[i] = ((rij[i] + Rij[i-1]*pp)/(1+rij[i]*Rij[i-1]*pp))
        Ref=(Rij[len(x)-1])*np.conj(Rij[len(x)-1])
    RR[j]=Ref.real
   stop = timeit.default_timer()
   print("Time taken to calculate RR", stop-start)
   return RR+GFP[9]

我错过了什么?感谢您的帮助和建议


Tags: datalennpfiles曲线nrprintdatay