难以在numpy中使用单精度浮动

时间:2017-02-27 06:39:52

标签: python numpy floating-point precision

在numpy中使用单精度(float32)编写代码时,写入起来太难了。

首先,单个预先浮动的decalartion太长。我们必须按如下方式键入所有变量。

a = np.float32(5)

但是其他一些语言使用更简单的表示法。

a = 5.f

其次,气密操作也很不方便。

b = np.int32(5)+np.float32(5)

我预计b的类型为numpy.float32,但它是numpy.float64

当然,

b = np.add(np.int32(5), np.float32(5), dtype=np.float32)

返回我想要的东西。但是更换所有操作的时间太长了。

是否有更简单的方法在numpy中使用单精度?

1 个答案:

答案 0 :(得分:2)

首先让我解释为什么你不想在Python中使用单精度浮点数:

  • 大多数架构可以像单精度浮动一样快速地处理双精度。 Python中的算术运算在Python类型上运行速度很快,但在其他类型运行速度较慢。

    import numpy as np
    a32 = np.float32(1)
    a64 = np.float64(1)
    a = 1.
    %timeit [a32 + a32 for _ in range(20000)]  # 100 loops, best of 3: 4.58 ms per loop
    %timeit [a64 + a64 for _ in range(20000)]  # 100 loops, best of 3: 4.83 ms per loop
    %timeit [a + a for _ in range(20000)]      # 100 loops, best of 3: 2.72 ms per loop
    
  • Python类型的开销太大,以至于双精度浮点数的内存开销几乎可以忽略不计。

    import sys
    import numpy as np
    
    sys.getsizeof(np.float32(1))  # 28
    sys.getsizeof(np.float64(1))  # 32
    sys.getsizeof(1.)             # 24  # that's also a double on my computer!
    

因此实际上没有使用单精度numpy浮点数有用的用例。它们比普通的python浮点慢,占用更多内存。

然而,在numpy中,使用单精度浮点数是有意义的,当且仅当你有大型数组时,否则会遇到内存问题。但是你又有了强制规则。这些实际上是为了让您不会遇到意想不到的问题。

int32 + float32的示例实际上就是一个很好的例子!您希望结果为float32,但是存在问题,您无法将最大的int32表示为float32

np.iinfo(np.int32(1))             # iinfo(min=-2147483648, max=2147483647, dtype=int32)
int(np.float32(2147483647))       # 2147483648
np.int32(np.float32(2147483647))  # -2147483648

是的,只需将值转换为单个精度浮点数并将其转换回整数即可更改其值。这就是NumPy使用双精度的原因,因此您不会得到意外结果!这就是为什么你需要强迫numpy 做一些可能出错的事情。

实际上,NumPy和Python试图使最有效(计算和内存方式)的方法最容易使用,而效率较低的方法也很复杂。

这意味着提示

但请注意,当它真正重要时(仅适用于数组),更容易做到正确:

arr = np.linspace(0, 100000, 10000, dtype=np.float32)
arr += 10  # add 10 to each element
arr.dtype  # still "float32"

在这种情况下,它仍然不比在float64上运行快得多,但对于数组,你可能会关心内存开销!