当在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条答案
按热度按时间xqkwcwgp1#
问题在于,当您在运算中使用不同类型时,NumPy会提升类型。只有当另一个数值操作数的dtype为:
float32
或更少int16
或更少uint16
或更少如果另一个操作数具有另一个dtype,则结果为
float64
(如果另一个操作数是复数,则为complex
)。上面列出的数据类型不是最常见的,因此几乎所有操作都是(特别是当另一个是Python整型/浮点型时),使用标准运算符+
、-
、/
、*
,...将您的float32
升级为float64
。不幸的是,你无法避免这种情况。在很多情况下,NumPy这样做是可以的,因为:
但是,如果您有巨大的数组,并且遇到内存问题,或者如果您与其他需要单精度浮点数的库(机器学习、GPU等)交互,则使用单精度浮点数是有意义的。
但是如上所述,您几乎总是要与强制规则作斗争,因为强制规则可以防止您遇到意想不到的问题。
int32 + float32
的例子实际上是一个很棒的例子!你期望结果是float32
--但是有一个问题:你不能把每个int32
都表示成float32
是的,仅仅通过将值转换为单精度浮点数并将其转换回整数,它就改变了它的值。这就是为什么NumPy使用双精度,这样你就不会得到一个意外的结果!这就是为什么你需要强制NumPy做一些可能出错的事情(从一般用户的Angular 来看)。
因为没有(据我所知)限制Numpy类型提升的方法,所以你必须自己发明。
例如,您可以创建一个类来 Package NumPy数组,并使用特殊方法为运算符实现dtype-d函数:
但这只实现了NumPy功能的一小部分,很快就会导致大量的代码和边缘情况,可能已经被遗忘。现在可能有更聪明的方法使用
__array_ufunc__
或__array_function__
,但我自己没有使用过这些,所以我不能评论工作量或适用性。因此,我的首选解决方案是为所需的函数创建辅助函数:
或者只使用原地操作,因为这些操作不会提升类型: