这个python代码:
import numpy,math
import scipy.optimize as optimization
import matplotlib.pyplot as plt
# Create toy data for curve_fit.
zo = numpy.array([0.0,1.0,2.0,3.0,4.0,5.0])
mu = numpy.array([0.1,0.9,2.2,2.8,3.9,5.1])
sig = numpy.array([1.0,1.0,1.0,1.0,1.0,1.0])
# Define hubble function.
def Hubble(x,a,b):
return H0 * m.sqrt( a*(1+x)**2 + 1/2 * a * (1+b)**3 )
# Define
def Distancez(x,a,b):
return c * (1+x)* np.asarray(quad(lambda tmp:
1/Hubble(a,b,tmp),0,x))
def mag(x,a,b):
return 5*np.log10(Distancez(x,a,b)) + 25
#return a+b*x
# Compute chi-square manifold.
Steps = 101 # grid size
Chi2Manifold = numpy.zeros([Steps,Steps]) # allocate grid
amin = 0.2 # minimal value of a covered by grid
amax = 0.3 # maximal value of a covered by grid
bmin = 0.3 # minimal value of b covered by grid
bmax = 0.6 # maximal value of b covered by grid
for s1 in range(Steps):
for s2 in range(Steps):
# Current values of (a,b) at grid position (s1,s2).
a = amin + (amax - amin)*float(s1)/(Steps-1)
b = bmin + (bmax - bmin)*float(s2)/(Steps-1)
# Evaluate chi-squared.
chi2 = 0.0
for n in range(len(xdata)):
residual = (mu[n] - mag(zo[n], a, b))/sig[n]
chi2 = chi2 + residual*residual
Chi2Manifold[Steps-1-s2,s1] = chi2 # write result to grid.
引发此错误消息:
ValueError Traceback (most recent call last)
<ipython-input-136-d0ef47a881a7> in <module>()
36 residual = (mu[n] - mag(zo[n], a, b))/sig[n]
37 chi2 = chi2 + residual*residual
---> 38 Chi2Manifold[Steps-1-s2,s1] = chi2 # write result to
grid.
ValueError: setting an array element with a sequence.
注意:如果我定义了一个简单的mag函数,例如(a + b * x),我不会收到任何错误信息。
事实上,Hubble,Distancez和Meg三个函数都必须是redshift z的函数,这是一个数组。
现在您认为我需要重新定义所有这些函数以获得输出数组吗?我的意思是首先,创建一个redshift数组,然后函数的输出自动成为数组?
我需要将Distancez()和mag()函数的输出作为数组。我设法做到了,只需将Distancez函数中积分的上限从x更改为x.any()即可。现在我有一个数组,这就是我想要的。但是,现在我看到例如Distance(0.25,0.5,0.3)的输出值与我刚刚将x放在积分上限时的输出值不同?任何帮助将不胜感激。
感谢您的回复。
我需要将Distancez()和mag()函数的输出作为数组。我设法做到了,只需将Distancez函数中积分的上限从x更改为x.any()即可。现在我有一个数组,这就是我想要的。但是,现在我看到例如Distance(0.25,0.5,0.3)的输出值与我刚刚将x放在积分上限时的输出值不同?任何帮助将不胜感激。
答案 0 :(得分:1)
ValueError表示它不能为数组Chi2Manifold
分配一个值为序列的元素。 chi2
可能是一个numpy数组,因为residual
是一个numpy数组,因为你的mag()
函数返回一个numpy数组,因为你的Distancez
函数返回一个numpy数组 - 你告诉它用np.asarray()
执行此操作。
如果Distancez()
返回标量浮点值,则可能会设置。您需要在np.asarray()
中使用Distancez()
吗?这实际上是一个单元素数组,或者您打算以某种方式将其减少为标量。我不知道你的Hubble()
函数应该做什么,我不是天文学家,但根据我的经验,距离通常是标量;)。
如果chi2
是序列或numpy数组,您可能希望在Chi2Manifold
到chi2
中设置适当大小的值范围。