我发现numpy数组的astype()方法效率不高。我有一个数组包含 300万美元8分。将其乘以3x3矩阵需要2秒,但将结果从uint16转换为uint8需要另一秒。
更准确地说:
print time.clock()
imgarray = np.dot(imgarray, M)/255
print time.clock()
imgarray = imgarray.clip(0, 255)
print time.clock()
imgarray = imgarray.astype('B')
print time.clock()
点积和缩放需要2秒
剪辑需要200毫秒
类型转换需要1秒
考虑到其他操作所花费的时间,我希望astype
更快。
有没有一种更快的方法来进行类型转换,或者当我猜测类型转换不应该那么难的时候我错了?
编辑:目标是将最后的8位数组保存到一个文件中
使用
imgarray = imgarray.astype('B')
时,会得到数组的副本,并强制转换为指定类型。这需要额外的内存分配,即使您立即翻转imgarray以指向新分配的数组。如果使用
imgarray.view('uint8')
,则可以看到数组的视图。除了解释为uint8
而不是imgarray.dtype
之外,它使用相同的数据。 (np.dot
返回一个uint32
数组,因此在np.dot
之后,imgarray
是uint32
类型的。)然而,使用
view
的问题是,32位整数被视为4个8位整数,我们只关心最后8位的值。所以我们需要跳到每4个8位整数。我们可以通过切片:imgarray.view('uint8')[:,::4]
IPython的%timeit命令显示这样做会显著加快速度:
相关问题 更多 >
编程相关推荐