【问题标题】:Should I use numpy.float64 instead of Python float when also using numpy.array在使用 numpy.array 时我应该使用 numpy.float64 而不是 Python float
【发布时间】:2023-03-09 07:21:01
【问题描述】:

到目前为止我还没有遇到任何问题,所以这个问题纯粹是出于好奇。

在 Python 中,我通常像这样定义浮点数和浮点数数组:

import numpy as np

s = 1.0
v = np.array([1.0, 2.0, 3.0])

在上面的例子中sfloat,但v 的元素是numpy.float64 类型。

为了更加一致,例如,我可以这样做:

import numpy as np

s = np.float64(1.0)
v = np.array([1.0, 2.0, 3.0])

从准确性/精确度的角度来看,是否存在建议使用“一致”方法的情况?在“不一致”的方法中,我可以预期什么样的错误(如果有)?

【问题讨论】:

  • 如果我想要一个特殊 dtype 的标量,我会使用 s=np.array(1.0, dtype=...)

标签: python numpy floating-point precision


【解决方案1】:

Python(至少 CPython)在内部使用双精度数,因为它是 float 类型 - 双精度数是 64 位浮点数(可能并非总是如此,但我还没有找到双精度数不是 64 位浮点数的平台 + 编译器)。

因此,无论您将它们保留为float 还是np.float64,都不应期待任何类型的问题。

但是,如果您使用 Pythons float 和 NumPys np.float32,则可能会出现差异,因为 floatnp.float32(32 位)具有更高的精度(64 位)。

【讨论】:

  • C 双精度有 8 个字节的假设仍然硬连线到 CPython 源代码中的各个位置,所以如果 CPython 遇到双精度不是 64 位的平台,它可能会坏得很厉害。 (是的,我假设字节有 8 位,但如果 CPython 遇到过一个字节没有 8 位的平台,它会更糟糕。)所以 IOW,你假设双精度数是 64 位浮点数是一个相当安全的。 :-)
  • 这是一个这样的例子,在 marshal 模块中假设 8 字节双精度:github.com/python/cpython/blob/v3.6.2/Python/…
  • @MarkDickinson 很高兴知道。我只是做了一个肤浅的搜索,当我发现一个作者想要"Ensure C++ doubles are 64 bits"的问题时,我认为可能存在差异。
猜你喜欢
  • 1970-01-01
  • 2012-05-11
  • 2011-08-14
  • 2012-11-19
  • 2023-03-15
  • 2011-03-02
  • 2016-05-23
  • 2020-05-02
  • 2010-09-28
相关资源
最近更新 更多