numpy.uint():将浮点数转换为 uint 给出 [完全] 不同的大数字结果

numpy.uint(): transform float to uint gives [Totally] different results with large numbers

提问人:Qwerth 提问时间:7/21/2023 更新时间:7/21/2023 访问量:45

问:

我正在试验和numpy.uint()numpy.around()

这是我所做的:

>>> matrix = np.matrix([-32, -32.0, -3.91886975727153e-15])
>>> matrix
    matrix([[-3.20000000e+01, -3.20000000e+01, -3.91886976e-15]])
>>> np.uint(matrix)
...         
    matrix([[4294967264, 4294967264,          0]], dtype=uint32)
>>> np.around(matrix)
...                         
    matrix([[-32., -32.,  -0.]])
>>> np.uint(np.around(matrix))
...                         
    matrix([[4294967264, 4294967264,          0]], dtype=uint32)

同样的情况发生,但值不同:np.uint8np.uint16

np.uint8(np.around(matrix))
matrix([[224, 224,   0]], dtype=uint8)

np.uint16(np.around(matrix))                        
matrix([[65504, 65504,     0]], dtype=uint16)

为什么 uint 函数会以这种方式工作?

python 数组 numpy 浮点 uint

评论

2赞 Swifty 7/21/2023
'....给出完全不同的结果......':与什么不同?你期待什么?
2赞 Mechanic Pig 7/21/2023
你知道in是什么意思吗?uuint
1赞 Jérôme Richard 7/22/2023
将负值转换为无符号整数目前会导致 Numpy 中出现未定义的行为(尽管该值通常被 -1 转换为目标整数类型,通常与平台相关)。在这种情况下,我们尝试了尽可能多的警告,但在极少数情况下,它没有消息。请检查您使用的是最新版本的 Numpy,并请注意警告。我们还假设用户不要进行没有任何意义的转换(尽管当向此类转换函数提供意外值时,可能会发生这种情况)。2**32-1
0赞 Qwerth 7/22/2023
@Swifty,是的,从预期结果来看。现在我明白了 beetwen 的区别以及为什么 uint 给出这些结果(这实际上在我的计算机上是可预测的)。@JérômeRichard,我使用的是numpy 1.24.1版本,如果你的意思是Python警告,我没有得到任何警告。intuint
0赞 Sam Mason 7/23/2023
@Qwerth“未定义的行为”是一个常用术语,但可能值得一查。值得弄清楚是什么定义了你看到的行为,以及你是否关心什么时候不适用。具体来说,这是由于流行的 CPU 使用 2 的补码整数运算

答: 暂无答案