在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中使用单精度?
答案 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
上运行快得多,但对于数组,你可能会关心内存开销!