我正在寻找程序中的错误,我发现它是由 Numpy 的意外行为产生的...
例如,使用 Python3k 和 Numpy 对不同整数类型进行简单算术运算时,例如
(numpy.uint64) + (int)
结果是……一个 numpy.float64
这是一个例子:
v = numpy.array([10**16+1], dtype=numpy.uint64)
print(v[0])
v[0] += 1
print(v[0])
它产生以下结果:
10000000000000001
10000000000000000
当您处理整数以避免舍入错误时,这可能会非常出乎意料...
上面的“问题”可以通过用 numpy.uint64(1) 替换 1 来轻松解决,但是我可以看到很多错误来自于此。这种情况背后的规律和逻辑是什么?在这种情况下是否有关于强制执行方式的文档?我找不到它。
我之前认为您可以通过使用 .item() 对强制转换有一些了解,但它更具误导性:
v = numpy.array([10**16+1], dtype=numpy.uint64)
print(type(v[0].item()))
v[0] = v[0].item() + 1
print(v[0])
产生
<class 'int'>
10000000000000001
10000000000000002
所以 .item() 将 numpy.uint64 转换为 int,如果你在算术运算中明确使用它,它就可以工作。
我很惊讶(但我想我缺乏 numpy 经验),当“a”对应于 numpy 特定的 dtype 时,
a.item() + 1
和
a + 1
不会产生相同的结果...因此在转换回 numpy dtype 时会产生不同的结果。
(使用的环境是最新的 Pyzo 发行版,通过 IEP,如果重要的话。我通常使用 Python 2,但我必须在 Py3k 中进行一些测试,这是一种方便的方法.)
最佳答案
如上所述:
它适用于:
dtype=np.int64
代替:
dtype=np.uint64
python 2 和 3,numpy 1.6 和 1.9。
只需使用:
np.int64
没有理由使用 uint64
,在 2⁶⁴ - 1
或 2⁶³ - 1
处溢出对于所有实际应用来说几乎都是一样的目的。
引用资料
关于python - 意外的 Numpy/Py3k 强制规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31676627/