当您使用imgarray = imgarray.astype(‘B’)时,您将获得一个数组的副本,转换为指定的类型.这需要额外的内存分配,即使您立即将imgarray翻转为指向新分配的数组.
如果您使用imgarray.view(‘uint8’),那么您将获得该数组的视图.这使用相同的数据,除了它被解释为uint8而不是imgarray.dtype.
(np.dot返回一个uint32数组,所以在np.dot之后,imgarray的类型是uint32.)
然而,使用视图的问题是,32位整数被视为4个8位整数,我们只关心最后8位的值.所以我们需要跳到第4个8位整数.我们可以用切片做到这一点:
imgarray.view( ‘UINT8’)[:,:4]
IPython的%timeit命令显示了以下方式可以大大加快事情的进行:
In [37]: %timeit imgarray2 = imgarray.astype('B')
10000 loops, best of 3: 107 us per loop
In [39]: %timeit imgarray3 = imgarray.view('B')[:,::4]
100000 loops, best of 3: 3.64 us per loop