ValueError: установка элемента массива с последовательностью Ask - PullRequest
0 голосов
/ 26 апреля 2018

Этот код 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 должны быть функциями красного смещения z, являющегося массивом.

Теперь вы думаете, что янужно переопределить все эти функции, чтобы иметь выходной массив?Я имею в виду сначала создать массив красного смещения, а затем выходные данные функций автоматически становятся массивом?


Мне нужны выходные данные функций Distancez () и mag (), которые должны быть массивами.Мне удалось это сделать, просто изменив верхний предел интеграла в функции Distancez с x на x.any ().Теперь у меня есть массив, и это то, что я хочу.Однако теперь я вижу, что выходное значение, например, Расстояния (0,25, 0,5, 0,3) отличается от того, когда я просто помещаю x в верхний предел интеграла?Буду признателен за любую помощь.


Спасибо за ваш ответ.

Мне нужно, чтобы выходные данные функций Distancez () и mag () были массивами.Мне удалось это сделать, просто изменив верхний предел интеграла в функции Distancez с x на x.any ().Теперь у меня есть массив, и это то, что я хочу.Однако теперь я вижу, что выходное значение, например, Расстояния (0,25, 0,5, 0,3) отличается от того, когда я просто помещаю x в верхний предел интеграла?Любая помощь будет оценена.

1 Ответ

0 голосов
/ 26 апреля 2018

ValueError говорит, что не может присвоить элемент массива Chi2Manifold со значением, которое является последовательностью.chi2, вероятно, является массивом NumPy, потому что residual является массивом NUMPY, потому что ваша функция mag() возвращает массив NUMPY, и все потому, что ваша функция Distancez возвращает массив NUMPY - вы говорите ей сделать это с этимnp.asarray().

Если бы Distancez() вернул скалярное значение с плавающей запятой, вы, вероятно, были бы установлены.Вам нужно использовать np.asarray() в Distancez()?Это на самом деле массив из 1 элемента, или, возможно, вы намереваетесь каким-то образом уменьшить его до скаляра.Я не знаю, что должна делать ваша Hubble() функция, и я не астроном, но в моем опыте расстояния часто являются скалярами;).

Если chi2 подразумевается как последовательность илиnumpy array, вы, вероятно, захотите установить диапазон значений подходящего размера от Chi2Manifold до chi2.

...