numpy:如何在添加数字时保持半精度数组标量输入的数据类型

numpy: how to keep datatype of half precision array scalar input when adding a number

我有一个可能是数组标量的半精度输入 x = np.float32(3)。我想添加一个:y = x + 1。但是 y 将是 float64 而不是 float32。

我只能想到两个解决方法:

但是,我有很多函数,所以上面的修复需要我在每个函数中添加 if-else 语句...有没有更好的方法?谢谢!

0x5 “将整数添加到 half-float 没有产生预期的结果”为什么是一半大小? 0x6a0100 在 ufunc 中“float64 无法转换为 numpy.complex64”。 Numpy 应该知道

自 numpy 1.13 以来,我们正在经历类型转换的不确定性。在 0x67“Quick fix for integer operation with half dtype in NumPy”中讨论过。决定解决如下:“与Matlab兼容,运行前总是转换为float16”。 0x6e 中报告的错误“sum(a) where a = float32(1) is float64”回溯了该决定,但没有清楚地理解:

问题在于数据类型如何通过标量输入传播。这是一个比求和更大的问题。正如您所经历的,将标量与数组混合始终是一个灰色区域。在某些情况下(deconte abd deduce)应该会出现这样的混合,但是对于 np 应该如何处理它们还没有达成共识(参见 0x75“Array scalar artifact at a ufunc boundary”)。直到解决了.. Matlab 的向上转换,因为它会转换为 16,所以对于 numpy 来说不是一个好方法。向上转换对于产品来说尤其有问题,并且可能是 numpy 问题有时会提示的原因,但是“matlab 不需要修改,因为数学家已经习惯了这种惊喜”,这也意味着这些数学家使用 matlab 时会发出警告, 和“不需要修改,因为 C 是这样定义的”,这也意味着 C 被用在浮点数上,就好像它们是整数一样,以避免意外。

您可以像下面这样使用 numpy.add(..., dtype=np.float64)

>>> res = np.add(np.array([3], dtype=np.float32), np.float16(1), dtype=np.float64)
>>> res
array([4.])

>>> res.dtype
dtype('float64')

如您所述,将 python 值添加到标量数组 returns 具有默认 dtype 的值:

In [188]: np.float32(1.0) + 1
Out[188]: 2.0

In [189]: type(_)
Out[189]: numpy.float64

为什么关注这个数据类型?

如果将标量添加到数组中,dtype 会保留。

In [190]: np.array([1.0], 'float32')+1
Out[190]: array([2.], dtype=float32)

我怀疑使用 np.float32(..) 而不是创建数组的代码。通常我们担心大型数组的数据类型,而不是单个术语 - 特别是如果重点是内存使用。

获取 np.float32 对象的最自然情况是当我们提取数组的元素时:

In [193]: type(np.array([1.0], 'float32')[0])
Out[193]: numpy.float32

保留类型是两个术语具有相同的类型

In [196]: type(np.float32(12)+np.float32(34))
Out[196]: numpy.float32

创建 float64:

的是标量到 numpy 的转换
In [198]: np.array(1.0).dtype
Out[198]: dtype('float64')