2015-02-15 5 views
1
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)) 

Спасибо за ваш ответ, но теперь возникла проблема:NumPy ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.All() leastsq

--------------------------------------------------------------------------- 
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. 

Я пытаюсь изменить DTYPE массив из complex128 в float64 но Ждут» т помощь :(

Я ищу, может быть np.interp, но я не знаю, какой массив ая должна изменить

Может ли вы какие-либо идеи, что я должен делать?

ответ

0
if (b != Inf and a != -Inf): 

Это попытка выполнить операцию Python if, но (b != Inf and a != -Inf) возвращает массив значений типа boolean, а не значение True/False. Если это ваш собственный код, вы можете добавить np.any(...), чтобы объединить значения. Но в этом контексте я подозреваю, что проблема заключается в том, что либо a, либо b является массивом, когда он должен быть скаляром.

Можете ли вы проследить эти значения обратно в стек вызовов?

Было много вопросов, связанных с этим сообщением об ошибке.

+0

Да, у вас есть право. 'b' - массив, но верхнее значение этого интеграла должно брать из массива. Для каждого значения значение 'b' задается значением из массива z –

+0

. Затем ваша функция должна быть записана таким образом, что обрабатывает этот массив' z', принимая во внимание, что 'quad' ожидает скаляр. – hpaulj

3

Сообщение об ошибке может быть воспроизведен, как это:

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() 

Теперь в вашем коде, z массив:

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

z переходит в руки residuals:

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

Внутри residuals, xup присваивается значение z.

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

Внутри xlambda, xup - вектор - передается непосредственно quad:

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

Отсюда ValueError.


Предположительно, вы хотите xlambda называть один раз для каждого значения в xup. Таким образом, вы можете исправить эту проблему, используя

def residuals(p, xup, y, dmu): 
    xl = np.array([xlambda(p, x) for x in xup]) 
    return ((y-xl)/dmu)**2 
Смежные вопросы

 Смежные вопросы