You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:47:37