numpy的ValueError错误:与一个以上的元件的阵列的真值是不明确的。使用a.any()或a.all()leastsq [英] NumPy ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() leastsq

查看:1600
本文介绍了numpy的ValueError错误:与一个以上的元件的阵列的真值是不明确的。使用a.any()或a.all()leastsq的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

from sympy import *
from scipy import *
from scipy.integrate import quad
import scipy.optimize as optimize
import numpy as np
import collections
import math
from scipy.optimize import leastsq

file= DATA+'Union21.dat'
with open(file, "r") as f:
    data0=[(float(v[1]),float(v[2]), float(v[3])) for v in [x.split() for x in f.readlines()][1:]]
#print data0

z=np.array([float(t[0]) for t in data0])
mu=np.array([float(t[1]) for t in data0])
dmu=np.array([float(t[2]) for t in data0])
c=3*10^8

def calka(x, OmM):
    return 1./math.sqrt(OmM*(1.+x)**3 + (1.-OmM))

def xlambda(p,xup): 
    H0=p
    calka1 = quad(calka, 0., xup, args=(p[0]))[0]
    mu_obs = 5.*math.log(c*calka1/p[1]) + 25 
    return mu_obs


def residuals(p, xup,y,dmu):
    return ((y-xlambda(p,xup))/dmu)**2

leastsq(residuals,(0.25, 70), args=(z, mu, dmu))

感谢您的回答,但现在出现了一个问题:

Thank you for your answer but now there was a problem:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call     last)
TypeError: Cannot cast array data from dtype('complex128') to     dtype('float64') according to the rule 'safe'

---------------------------------------------------------------------------
error                                     Traceback (most recent call     last)
<ipython-input-38-00c118ea80ce> in <module>()
----> 1 leastsq(residuals,[0.25, 70], args=(z, mu, dmu))

/opt/anaconda/envs/np18py27-1.9/lib/python2.7/site-packages/scipy    /optimize/minpack.pyc in leastsq(func, x0, args, Dfun, full_output,     col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
377             maxfev = 200*(n + 1)
378         retval = _minpack._lmdif(func, x0, args, full_output, ftol, xtol,
--> 379                                  gtol, maxfev, epsfcn, factor, diag)
380     else:
381         if col_deriv:

error: Result from function call is not a proper array of floats.

我试着从complex128更改DTYPE阵列float64,但它并没有帮助:(

I try change dtype array from complex128 to float64 but it didn't help :(

我找也许np.interp但我不知道哪一个数组我必须改变。

I looking for maybe np.interp but i don't know which array a i must change

你能任何想法,我有什么做的?

Can you any idea what i have to do?

推荐答案

该错误信息可以复制这样的:

The error message can be reproduced like this:

import numpy as np
import scipy.integrate as integrate

xup = np.random.random(10)

def calka(x, OmM):
    return 1./math.sqrt(OmM*(1.+x)**3 + (1.-OmM))


# Passing a scalar value, 10, for the upper limit is fine:
integrate.quad(calka, 0., 10, args=(0.25,))
# (2.3520760256393554, 1.9064918795817483e-12)

# passing a vector, xup, raises a ValueError:
integrate.quad(calka, 0., xup, args=(0.25,))
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()


现在,在code,以Z 是一个数组:

z=np.array([float(t[0]) for t in data0])

以Z 被传递给

leastsq(residuals,(0.25, 70), args=(z, mu, dmu))

XUP 被分配值以Z

def residuals(p, xup,y,dmu):
    return ((y-xlambda(p,xup))/dmu)**2

xlambda XUP - 向量 - 直接传递到

Inside xlambda, xup -- the vector -- is passed directly to quad:

def xlambda(p,xup): 
    H0=p
    calka1 = quad(calka, 0., xup, args=(p[0]))[0]

因此​​,ValueError错误。

Hence the ValueError.

presumably,你会想要 xlambda 来一次为 XUP 的每个值被调用。所以,你可以通过使用解决问题。

Presumably, you'd want xlambda to be called once for each value in xup. So you could fix the problem by using

def residuals(p, xup, y, dmu):
    xl = np.array([xlambda(p, x) for x in xup])
    return ((y-xl)/dmu)**2

这篇关于numpy的ValueError错误:与一个以上的元件的阵列的真值是不明确的。使用a.any()或a.all()leastsq的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆