2012-05-14 25 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

對於這些錯誤,您可以在指數中使用浮點數。例如:

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

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

最好的問候

相關問題