这可能有点具体,但我想更详细地了解Numpy(NumPy版本1.26.3)的这种行为.

我在编写一个简单的Park和Miller随机数生成器时遇到了这个问题.它涉及到用2^31-1计算模数,只是碰巧定义了它,就像这样:

m = numpy.power(2,31)-1

得到了RuntimeWarning: overflow encountered in scalar subtract m = numpy.power(2,31)-1英镑的警告.起初我有点惊讶,但我很快意识到,默认情况下,NumPy可以与int32一起使用,即使在64位计算机上也是如此.但这让我想知道为什么电源没有错误,它溢出了有符号的32位整数.结果仍然是正确的:

print(type(m),m)

<class 'numpy.int32'> 2147483647

直接存储2147483648到m会产生溢出错误OverflowError: Python int too large to convert to C long.

这很有效;我得到了一个警告,因为我存储的是2^31-1.如果我存储的是2^31,我会得到一个错误的答案,没有任何警告:

test = np.power(2,31)
print(type(test),test)

<class 'numpy.int32'> -2147483648

而不是正确答案,2147483648.对于什么时候应该仔细判断Numpy的这种行为,有什么指导方针吗?

推荐答案

正如我所怀疑的,这是一个重复的问题.Numpy不对数组进行溢出检测.显然,这需要硬件支持来保持数组操作对于大型数组足够快,而当前几代硬件不支持它.

看见

https://github.com/numpy/numpy/issues/8987

Using numpy to square value gives negative number

https://stackoverflow.com/users/901925/hpaulj人以 comments 的形式发布.

Python相关问答推荐

螺旋桨图上意外颠倒的次y轴

仅使用2种 colored颜色 创建热图

Pandas 按照特殊规则保留每n行

Numpy索引argsorted使用integer数组,同时保留排序顺序

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

阅读Polars Python中管道的函数定义

如何将ctyles.POINTER(ctyles.c_float)转换为int?

当多个值具有相同模式时返回空

_repr_html_实现自定义__getattr_时未显示

输出中带有南的亚麻神经网络

将9个3x3矩阵按特定顺序排列成9x9矩阵

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

递归访问嵌套字典中的元素值

如何启动下载并在不击中磁盘的情况下呈现响应?

在两极中过滤

Tkinter菜单自发添加额外项目

如何杀死一个进程,我的Python可执行文件以sudo启动?

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

干燥化与列姆化的比较

为什么在FastAPI中创建与数据库的连接时需要使用生成器?