numpy 是否完全重现了 C 的常规操作行为?
我正在用Python设计一个算法,之后我知道我会想把它转到C语言上。
不过,Python中的数学运算可能和C语言的结果不一样。比如在C语言中,对于无符号整数,4294967295 + 1 = 0
,但在普通的Python整数运算中并不是这样。因此,我在设计时不应该使用Python的整数。
我能不能安全且简单地使用Numpy来模拟C语言的行为?也就是说,如果我对类型为np.uint32
或np.float64
的数组进行常规运算(比如加、减、乘、除、取余,或者从浮点数转为整数,反之亦然),我能保证(或者能以某种方式得到这个保证)得到和C程序中使用uint32_t
和float64_t
相同的结果吗?
我只关心C语言的“官方行为”,任何依赖于编译器或处理器的内容在C中也可能和Numpy不同,就好像它是另一个编译器或处理器。我特别提到这一点,因为Numpy有一个NaN(不是数字),而这个在C中并不总是存在。
编辑后补充:
我更具体地关注这组操作:(加、减、乘、除、取余,从浮点数转为整数,或反过来)。
我试着查看Numpy的文档,但没有找到有用的信息,也自己做了一些测试,比如:
测试1:int32溢出((uint32_t) 4294967295 + (uint32_t) 1 == 0
在C中)
这似乎在Numpy标量中不适用。
>>> import numpy
>>> a = numpy.uint32(4294967295)
>>> type(a)
<class 'numpy.uint32'>
>>> a += 1
>>> a
4294967296
>>> type(a)
<class 'numpy.int64'>
但在Numpy数组中是可以的:
import numpy
a = numpy.array([4294967295], dtype='uint32')
a += 1
print(a)
print(a.dtype)
输出:
[0]
uint32
但这个特定的案例并不能让我确信它在数组中总是有效。
**测试2:负整数除法:**
-1/2 == 0
在C中对于int32是这样的。
但在“普通”的Numpy中:
two = np.int64(2)
mone = np.int64(-1)
print(mone / two)
print(mone // two)
结果是:
-0.5
-1
我在想是否有某种“开关”或者操作数可以使用,这样Numpy在上述情况下就能给我0。
1 个回答
看起来简单的答案是不
- 负整数的除法表现得不一样:
-1/2 == 0
在C语言中对于int32类型来说是这样。
但是在“普通”的numpy中:
two = np.int64(2)
mone = np.int64(-1)
print(mone / two)
print(mone // two)
- 对负数来说,取模运算的表现也不同(感谢@Nick ODell的评论):numpy(和python)总是给出非负的结果(在Python中,取模运算符(%)如何处理负数?)
而且在numpy中似乎没有“开关”或者其他操作符可以让它表现得像C语言那样