问题在标题中,非常简单。
我有一个文件 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')
