2012-05-14 4 views
1

Это часть кода, над которым я работаю. Посмотрите на последнюю строку.RuntimeWarning: недопустимое значение, возникающее при работе

def xyz2srgb(xyz): 
    """Convert from XYZ colorspace to sRGB""" 
    xyz = xyz.T 
    srgb = N.zeros_like(xyz) 
    srgb[0] = 3.241*xyz[0] - 1.5374*xyz[1] - 0.4986*xyz[2] 
    srgb[1] = -0.9692*xyz[0] + 1.876*xyz[1] + 0.0416*xyz[2] 
    srgb[2] = 0.0556*xyz[0] - 0.204*xyz[1] + 1.057*xyz[2] 

    srgb /= float(srgb.max()) 

    a = 0.055 
    srgb = N.where(srgb <= 0.0031308, 
       12.92*srgb, 
       (1+a)*srgb**(1/2.4)-a) 

Он выдает ошибку:

./example.py:29: RuntimeWarning: invalid value encountered in power 
    (1+a)*srgb**(1/2.4)-a) 

Является ли это какой-то предел диапазона? Я нашел аналогичную нить на SO: Numpy error: invalid value encountered in power

Любая подсказка? Благодарю.

ответ

3

Вы должны распечатать значения srgb. Вероятно, это не ошибка диапазона, то, что отрицательные коэффициенты здесь

srgb[0] = 3.241*xyz[0] - 1.5374*xyz[1] - 0.4986*xyz[2] 
srgb[1] = -0.9692*xyz[0] + 1.876*xyz[1] + 0.0416*xyz[2] 
srgb[2] = 0.0556*xyz[0] - 0.204*xyz[1] + 1.057*xyz[2] 

сделать это вполне возможно, что элементы srgb могут быть отрицательными, и если вы не уже работаете в комплексных числах, вы поднимете предупреждение, когда вы берете на себя власть:

>>> import numpy 
>>> numpy.array([-2.0]) 
array([-2.]) 
>>> numpy.array([-2.0])**(1/2.4) 
__main__:1: RuntimeWarning: invalid value encountered in power 
array([ nan]) 
>>> numpy.array([-2.0+0j])**(1/2.4) 
array([ 0.34548198+1.28935629j]) 

аргументов в where будет оцениваться, прежде чем они прошли, поэтому полномочия будут приняты до филиала при условии srgb <= 0.0031308 делит значения, а предупреждение.

0

Для этой ошибки вы можете использовать float в экспоненте. например:

>>> test = np.linspace(0,10,1000);) 

>>> expos = 2*np.power(test,**6.**)+2*np.power(test,**4.**) 

С наилучшими пожеланиями

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