【发布时间】:2014-11-13 10:07:59
【问题描述】:
我想在 np.float32 和内置 Python int 和 float 之间进行二进制操作(如加法和乘法),并获得 np.float32 作为返回类型。但是,它会自动向上转换为 np.float64。
示例代码:
>>> a = np.float32(5)
>>> a.dtype
dtype('float32')
>>> b = a + 2
>>> b.dtype
dtype('float64')
如果我使用 np.float128 执行此操作,b 也会变成 np.float128。这很好,因为它因此保持了精度。但是,在我的示例中,不需要向上转换到 np.float64 来保持精度,但它仍然会发生。如果我将 2.0(一个 Python 浮点数(64 位))添加到 a 而不是 2,那么强制转换是有意义的。但即使在这里,我也不要它。
所以我的问题是:在将二元运算符应用于 np.float32 和内置 Python int/float 时,如何更改已完成的转换?或者,将单精度作为所有计算的标准而不是双精度,也可以算作一种解决方案,因为我不需要双精度。别人问过这个问题,好像没有找到解决办法。
我知道 numpy 数组和 dtypes。在这里,我得到了想要的行为,因为数组始终保留其 dtype。然而,当我对数组的单个元素进行操作时,我得到了不需要的行为。 我对解决方案有一个模糊的想法,涉及子类化 np.ndarray(或 np.float32)并更改 __array_priority__ 的值。到目前为止,我还不能让它工作。
我为什么要关心?我正在尝试使用 Numba 编写一个 n-body 代码。这就是为什么我不能简单地对整个数组进行操作。将所有 np.float64 更改为 np.float32 可使速度提高约 2 倍,这很重要。 np.float64-casting 行为完全破坏了这种加速,因为我的 np.float32 数组上的所有操作都以 64 精度完成,然后向下转换为 32 精度。
【问题讨论】:
标签: python numpy numba single-precision