我正在尝试从API复制原始图像数据。数据是可迭代的,或者可以使用切片([:]
)。图像数据约为2000 x 2000像素。它是一个灰度浮点数组,存储在1D中。这就是我现在使用的:
imageData = np.fromiter(rawImageData, dtype=np.float32, count=width*height)
将数据复制到numpy数组大约需要2-3秒。有没有更快的方法来复制/整形数据?
其他信息:我之前尝试使用np.asarray
。它使它更快,但是与线程发生冲突,如果在主线程中尝试执行任何操作,而在单独的线程中执行操作,则程序将崩溃。
答案 0 :(得分:2)
我正在用枕头测试一张7200乘4800打开的.bmp图像。
In [26]: %timeit np.array(im)
1 loops, best of 3: 222 ms per loop
In [27]: %timeit np.asarray(im)
10 loops, best of 3: 156 ms per loop
转换为float32涉及一个副本,需要一些时间,但会节省内存:
In [39]: %timeit np.array(im, dtype=np.float32)
1 loops, best of 3: 444 ms per loop
In [40]: %timeit np.asarray(im, dtype=np.float32)
1 loops, best of 3: 543 ms per loop
fromiter
需要一维数组,所以让我们只抓住R chanel(我的图片是彩色的):
In [49]: %timeit np.fromiter(im.getdata(0), dtype=np.float32, count=7200*4800)
1 loops, best of 3: 2.49 s per loop
哎呀,有你的2-3秒。原因是迭代器对于numpy来说是一个非常不透明的东西,它喜欢非常结构化的东西。因此,它必须在飞行中推断出发生了什么,效率要低得多。因此,使用前两个函数之一,看看它们是否有效。