提问者:小点点

为什么numpy句柄溢出不一致?


为什么以下测试在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.41.21.51.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会这样吗?


共1个答案

匿名用户

Numpy基于C,因此它遵循C约定。事情是np. ye(4)是一个float64数字,2**32 1大于np.uint32可以处理的。这意味着versionA.astype(np.uint32)将导致float64-

  • https://github.com/numpy/numpy/pull/21437
  • https://github.com/numpy/numpy/pull/21123

我强烈建议您检查Numpy(v1.24.0)的最后一个版本,其中应该包含返工进行额外检查(即上面的第一个链接问题)。如果这仍然不起作用,请填写一个问题(上面的相关链接),以便我们讨论这个(长期存在的)问题。