Numpy vectorize似乎将数字“舍入”为最接近的整数:为什么?

kxeu7u2r  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(125)

似乎vectorize from numpy将number从float舍入为整数,我不明白为什么。
下面是一个例子:

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))

字符串
perrMax的所有元素都是1或0。最后一个元素例如等于0,而它应该等于perrMaxFunc(500)~4.91e-5。
因此,似乎vectorize函数以某种方式将perrMaxFunc的输出舍入为最接近的整数,我不明白为什么。
为什么代码要这样做?

7fyelxc5

7fyelxc51#

如评论中所述,问题在于数据类型。
请考虑以下示例:

2**np.array(32)
0

2**np.array(32.0)
4294967296.0

字符串
你可以清楚地看到,在int32的情况下,值为0。这是因为这个数字大于32位的存储量。在其他语言中,例如C/C++,这将是一个溢出,因为对于32位有符号整数,最大可表示值是231 − 1。为了克服这个问题,使用int64或float作为数据类型。考虑numpy integer overflow的阅读模式--python整数中不存在的东西,因为它们在溢出时自动升级为python长整数。
选项:

  • 2更改为2.0
  • 确保你传递一个浮点数到你的函数中,即n必须是浮点数。

将使用第一个选项:
这里有一个解决方法。我还使用了np.minimum而不是np.min来避免使用np.vectorize

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 np.minimum(1,res)

nmax= n500;

perrMax=perrMaxFunc(np.arange(nmax))
print(perrMax)
print(perrMaxFunc(500))

相关问题