为什么以下测试在Windows上运行良好,但在Linux上失败:
import numpy as np
print(f"Numpy Version: {np.__version__}")
# version A
versionA = np.eye(4)
versionA[:3, 3] = 2**32 + 1
versionA = versionA.astype(np.uint32)
# version B
versionB = np.eye(4, dtype=np.uint32)
versionB[:3, 3] = np.asarray(2**32 + 1)
# # version C
# # (raises OverflowError)
# versionC = np.eye(4, dtype=np.uint32)
# versionC[:3, 3] = 2**32 + 1
np.testing.assert_array_equal(versionA, versionB)
我在Windows和numpy版本的Linux测试了这一点:1.23.4
,1.21.5
,1.24.0
。在Windows上,赋值溢出到两个版本中的1
,断言比较相等。在Linux上,另一方面,versionB
溢出到1
,但versionA
导致赋值0
。结果,我得到以下失败:
AssertionError:
Arrays are not equal
Mismatched elements: 3 / 16 (18.8%)
Max absolute difference: 4294967295
Max relative difference: 4.2949673e+09
x: array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]], dtype=uint32)
y: array([[1, 0, 0, 1],
[0, 1, 0, 1],
[0, 0, 1, 1],
[0, 0, 0, 1]], dtype=uint32)
有人能解释为什么numpy会这样吗?
Numpy基于C,因此它遵循C约定。事情是np. ye(4)
是一个float64
数字,2**32 1
大于np.uint32
可以处理的。这意味着versionA.astype(np.uint32)
将导致float64-
我强烈建议您检查Numpy(v1.24.0)的最后一个版本,其中应该包含返工进行额外检查(即上面的第一个链接问题)。如果这仍然不起作用,请填写一个问题(上面的相关链接),以便我们讨论这个(长期存在的)问题。