gpt4 book ai didi

python - NumPy 的 : How to convert an array type quickly

转载 作者:太空狗 更新时间:2023-10-29 17:03:38 25 4
gpt4 key购买 nike

我发现 numpy 数组的 astype() 方法效率不高。我有一个数组包含300万个Uint8点。将它与 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'),您将获得数组的 View 。这使用相同的数据,只是它被解释为 uint8 而不是 imgarray.dtype。(np.dot返回一个uint32数组,所以在np.dot之后,imgarray类型>uint32.)

然而,使用view 的问题在于,一个 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

关于python - NumPy 的 : How to convert an array type quickly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1888870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com