使用 scipy.interpolate.interp1d
你还可以使用 scipy.interpolate
包来进行这样的转换(如果你不介意依赖于 SciPy 的话):
>>> from scipy.interpolate import interp1d
>>> m = interp1d([1,512],[5,10])
>>> m(256)
array(7.4951076320939336)
或者将其从0级Scipy数组转换回普通浮点数:
>>> float(m(256))
7.4951076320939336
您也可以轻松地在一个命令中进行多个转换:
>>> m([100,200,300])
array([ 5.96868885, 6.94716243, 7.92563601])
作为额外加分,您可以进行非均匀映射,例如如果您想将[1,128]映射到[1,10],[128,256]映射到[10,90]和[256,512]映射到[90,100],则可以按照以下方式实现:
>>> m = interp1d([1,128,256,512],[1,10,90,100])
>>> float(m(400))
95.625
interp1d
创建分段线性插值对象(可以像函数一样调用)。
使用 numpy.interp
正如 ~unutbu 提到的那样,numpy.interp
也是一个选择(依赖较少):
>>> from numpy import interp
>>> interp(256,[1,512],[5,10])
7.4951076320939336