python - 意外的 Numpy/Py3k 强制规则

标签 python numpy typing coerce

我正在寻找程序中的错误,我发现它是由 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⁶⁴ - 12⁶³ - 1 处溢出对于所有实际应用来说几乎都是一样的目的。

引用资料

关于python - 意外的 Numpy/Py3k 强制规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31676627/

相关文章:

python - 将 numpy.random.normal 与数组一起使用

python - 如何注释 Optional[int] 的包装器?难度 : when it's a parameter

java - 链接方法时不能依赖目标类型

java - 需要对这种通用类型进行简要描述

python子进程没有终止

python - 根据row_number过滤RDD

python - 计算管理值(value)的最有效方法

python - 添加缺失的列

python - Kivy 时钟和条件语句

python - 是否也可以在不运行 X 服务器的情况下运行 Selenium 脚本?