有没有办法让这个numpy行动更快?

2024-06-24 12:55:02 发布

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

我正在尝试从API复制原始图像数据。数据是可编辑的或可以使用切片([:])。图像数据约为2000 x 2000 px。它是一个灰度浮点数组,存储在1D中。这是我现在使用的:

imageData = np.fromiter(rawImageData, dtype=np.float32, count=width*height)

将数据复制到numpy数组大约需要2-3秒。有没有更快的方法来复制/塑造数据?你知道吗

其他信息:我以前尝试过使用np.asarray。它使它更快,但与线程有冲突,如果尝试在主线程中执行任何操作,而操作在单独的线程中执行,则程序会崩溃。你知道吗


Tags: 数据图像api编辑np切片数组线程
1条回答
网友
1楼 · 发布于 2024-06-24 12:55:02

我正在测试一个用枕头打开的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需要一个1D数组,所以我们只抓取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来说是一个非常不透明的东西,它喜欢非常结构化的东西。因此,它必须即时推断出发生了什么,而且效率要低得多。所以,使用前两个函数中的一个,看看它们是否有效。你知道吗

相关问题 更多 >