Numpy vectorize为何会将数值自动取整为最近整数?
问题:numpy.vectorize返回整数而非预期浮点数
用户运行以下代码时发现,np.vectorize处理后的结果全是1或0(比如n=500时输出0),但直接调用perrMaxFunc(500)能得到约4.91e-5的浮点数结果:
import numpy as np def epsilon(n): return 1.6952445781450207*2**(-1.028148909051717*n) def pPsi(n): return 1.0577183294485202*2**(-1.028620169094481*n) def perrMaxFunc(n): res=epsilon(n)/(2*np.abs(1/2**n-pPsi(n))) return min([1,res]) vectorized_perr=np.vectorize(perrMaxFunc) nmax=500; perrMax=vectorized_perr([i for i in range(nmax)]) print(perrMax) print(perrMaxFunc(500))
原因分析
np.vectorize默认会根据第一个调用的返回值推断输出数组的数据类型。当n=0时,perrMaxFunc(0)计算得到的结果是1(整数类型),所以vectorized_perr会将整个输出数组的类型设为整数。后续所有浮点数结果都会被强制转换为整数:小于1的浮点数(比如4.91e-5)会被截断为0,等于1的保持为1,最终出现全是0或1的情况。
解决办法
在创建vectorize对象时,通过otypes参数显式指定输出类型为浮点数,就能保留正确的计算结果:
vectorized_perr = np.vectorize(perrMaxFunc, otypes=[np.float64])
这样处理后,perrMax数组会以浮点数类型存储,n=500时的结果会正确显示为约4.91e-5。
内容的提问来源于stack exchange,提问作者StarBucK
相关产品推荐
相关产品推荐

