ValueError:使用序列设置数组元素询问

时间:2018-04-25 21:29:31

标签: least-squares model-fitting

这个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放在积分上限时的输出值不同?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

ValueError表示它不能为数组Chi2Manifold分配一个值为序列的元素。 chi2可能是一个numpy数组,因为residual是一个numpy数组,因为你的mag()函数返回一个numpy数组,因为你的Distancez函数返回一个numpy数组 - 你告诉它用np.asarray()执行此操作。

如果Distancez()返回标量浮点值,则可能会设置。您需要在np.asarray()中使用Distancez()吗?这实际上是一个单元素数组,或者您打算以某种方式将其减少为标量。我不知道你的Hubble()函数应该做什么,我不是天文学家,但根据我的经验,距离通常是标量;)。

如果chi2是序列或numpy数组,您可能希望在Chi2Manifoldchi2中设置适当大小的值范围。