(某些代码已被删除,例如绘制代码,但不会影响问题)
正如标题所述,我在Numpy的和函数中遇到问题四舍五入到最接近的整数。
在下面的代码中,我使用np.sum创建变量chisqrR,它按预期工作,给出我的值1.23727 ....在代码的底部附近,我几乎有完全相同的代码我需要的地方为' chisqr'找到一堆价值观。基于一系列输入值。感兴趣的三条线是:
chisqr[i] = np.sum(((counts - fit_exp_nonlin(t, popt[0], mu[i], popt[2]))/yerr)**2)
print(((counts - fit_exp_nonlin(t, popt[0], mu[i], popt[2]))/yerr)**2)
print(chisqr[i])
第一个'打印'没有np.sum命令的行给出了一堆值(所有这些都是长小数),但是,一旦它们被np.sum求和,我总是得到精确的整数,这绝对不可能。例如,在它之前的一个数组是:
[ 0.2251407 0.25516322 0.90413181 1.08316468 7.40191331 0.00893473
1.94594874 0.24967999 2.58848903 1.39550592 0.06140513]
和'总和'它给出的数组是:
16
然而,如果我手动汇总值,我会得到
16.11947726
同样,完整的代码如下:
# Imports
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import pylab
def main():
counts = np.array([0.72, 0.74, 0.82, 0.86, 1.18, 0.84, 1.14, 0.96, 1.44, 1.64, 1.76])
t = np.array([108.5, 99.0, 90.0, 81.0, 71.0, 58.0, 45.0, 35.5, 26.0, 13.0, 0])/10
xx = np.array(np.linspace(-1,max(t)+max(t)*0.1,500))
guess1 = 1.1914367
guess2 = 0.19740375
guess3 = 0.61534327
guess = (guess1, guess2, guess3)
popt, pcov = curve_fit(fit_exp_nonlin, t, counts, guess, maxfev=1000)
chisqrR = (np.sum(((counts - fit_exp_nonlin(t, *popt))/yerr)**2))/(len(t)-4)
pylab.xlim([-1,12])
print(chisqrR)
mu = np.array(np.linspace(popt[1] - .1,popt[1] + .1,100))
chisqr = np.array([0] * len(mu))
for i in range(len(mu)):
chisqr[i] = np.sum(((counts - fit_exp_nonlin(t, popt[0], mu[i], popt[2]))/yerr)**2)
print(((counts - fit_exp_nonlin(t, popt[0], mu[i], popt[2]))/yerr)**2)
print(chisqr[i])
def fit_exp_nonlin(t, a, b, c):
return a*np.exp(-b*t) + c
if __name__ == '__main__':
main()
这已经困扰了我很长一段时间了,我似乎无法弄明白,任何帮助都会非常感激。
谢谢。
答案 0 :(得分:1)
正如Norbert van Nobelen在评论中所述,这是通过改变
来解决的chisqr = np.array([0] * len(mu))
到
chisqr = np.array([0] * len(mu), dtype='f')
谢谢诺伯特!