如何强制numpy数组保持uint32类型以实现C语言式溢出行为?
解决Numpy中uint32类型溢出保持类型的问题
要让Numpy的uint32类型在溢出时像C语言那样回绕得到0,同时保持类型不变,有两种可靠的实现方式:
方式1:使用Numpy数组而非单个标量
Numpy数组的原地操作会严格遵循指定的dtype,溢出时自动按C风格回绕:
import numpy a = numpy.array(4294967295, dtype=numpy.uint32) a += 1 print(a) # 输出0 print(a.dtype) # 输出uint32
方式2:对单个标量显式控制类型
如果必须使用单个标量,可以通过显式转换或指定运算输出类型实现:
import numpy a = numpy.uint32(4294967295) # 方法A:运算后强制转回uint32 a = numpy.uint32(a + 1) # 方法B:用numpy.add指定输出类型 numpy.add(a, 1, out=a, dtype=numpy.uint32) print(a) # 输出0 print(type(a)) # 输出<class 'numpy.uint32'>
为什么原生标量操作会改变类型?
Numpy单个标量执行原地操作(如+=)时,若发生溢出会自动提升类型(比如从uint32转为int64)以避免数据丢失;而数组的dtype是固定的,不会自动提升,因此会遵循C语言的溢出回绕逻辑。
相关问题翻译
原问题:Does numpy exactly reproduce all C behaviors on usual operations?
翻译:Numpy是否能完全复刻C语言中常规操作的所有行为?
内容的提问来源于stack exchange,提问作者gdelab
相关产品推荐
相关产品推荐

