numpy:如何快速转换数组类型

2024-04-26 03:20:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现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位数组保存到一个文件中


Tags: 方法numpycliptimenp矩阵数组dot
1条回答
网友
1楼 · 发布于 2024-04-26 03:20:47

使用imgarray = imgarray.astype('B')时,会得到数组的副本,并强制转换为指定类型。这需要额外的内存分配,即使您立即翻转imgarray以指向新分配的数组。

如果使用imgarray.view('uint8'),则可以看到数组的视图。除了解释为uint8而不是imgarray.dtype之外,它使用相同的数据。 (np.dot返回一个uint32数组,因此在np.dot之后,imgarrayuint32类型的。)

然而,使用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

相关问题 更多 >