Skip to main content
 首页 » 编程设计

python之使用 NumPy 将 ubyte [0, 255] 数组转换为 float 组 [-0.5, +0.5] 的最快方法

2025年05月04日14qq78292959

问题在标题中,非常简单。

我有一个文件 f,我正在从中读取一个 ubyte 数组:

arr = numpy.fromfile(f, '>u1', size * rows * cols).reshape((size, rows, cols)) 
max_value = 0xFF  # max value of ubyte 

目前我正在对数据进行 3 次重新规范化,如下所示:

arr = images.astype(float) 
arr -= max_value / 2.0 
arr /= max_value 

由于数组有点大,这只需要很短的时间。
如果我可以在 1 或 2 遍数据中完成此操作,那就太好了,因为我认为那样会更快。

有什么方法可以让我执行“复合”向量运算以减少遍数?
或者,还有其他方法可以加快速度吗?

请您参考如下方法:

我做到了:

ar = ar - 255/2. 
ar *= 1./255 

似乎更快 :)

不,我计时了,它在我的系统上大约快两倍。看起来 ar = ar - 255/2. 会即时执行减法和类型转换。此外,标量除法似乎没有优化:先除法一次,然后再对数组进行一系列乘法运算会更快。尽管额外的浮点运算可能会增加舍入误差。

如评论中所述,numexpr可能是实现这一目标的真正快速而简单的方法。在我的系统上,这是另一个更快的因素,但主要是由于 numexpr 使用多个内核,而不是因为它只对数组进行一次传递。代码:

import numexpr 
ar = numexpr.evaluate('(ar - 255.0/2.0) / 255.0')