这是我正在处理的代码的一部分。看看最后一行。
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
有任何线索吗?感谢。
答案 0 :(得分: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
条件的分支之前进行分割,并触发警告。
答案 1 :(得分:0)
对于这些错误,您可以在指数中使用float。例如:
>>> test = np.linspace(0,10,1000);)
>>> expos = 2*np.power(test,**6.**)+2*np.power(test,**4.**)
祝你好运