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
问题描述
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屋!