栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将数以千计的图像读取到一个大的numpy数组中的最快方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将数以千计的图像读取到一个大的numpy数组中的最快方法

A部分:访问和分配NumPy数组

按照NumPy数组以行优先顺序存储元素的方式,每次迭代沿最后一个轴存储这些元素时,您做的正确。这些将占用连续的内存位置,因此对于访问和分配值将是最有效的。因此,像注释中提到的那样,初始化类似

np.ndarray((512*25,512),dtype='uint16')
np.ndarray((25,512,512), dtype='uint16')
最好的初始化。

将它们编译为用于测试时序并以随机数组(而不是图像)进行馈入的函子后,

N = 512n = 25a = np.random.randint(0,255,(N,N))def app1():    imgs = np.empty((N,N,n), dtype='uint16')    for i in range(n):        imgs[:,:,i] = a        # Storing along the first two axes    return imgsdef app2():    imgs = np.empty((N*n,N), dtype='uint16')    for num in range(n): imgs[num*N:(num+1)*N, :] = a        # Storing along the last axis    return imgsdef app3():    imgs = np.empty((n,N,N), dtype='uint16')    for num in range(n): imgs[num,:,:] = a        # Storing along the last two axes    return imgsdef app4():    imgs = np.empty((N,n,N), dtype='uint16')    for num in range(n): imgs[:,num,:] = a        # Storing along the first and last axes    return imgs

时间-

In [45]: %timeit app1()    ...: %timeit app2()    ...: %timeit app3()    ...: %timeit app4()    ...: 10 loops, best of 3: 28.2 ms per loop100 loops, best of 3: 2.04 ms per loop100 loops, best of 3: 2.02 ms per loop100 loops, best of 3: 2.36 ms per loop

这些定时确认在一开始提出的表演理论,虽然我预期的最后一个设置时序有定时的药粥之间

app3
app1
,但也许从最后要到第一线,用于访问和分配的影响不是线性的。关于这一方面的更多研究可能会很有趣(在此处跟踪问题)。

为了示意性地说明,考虑我们正在存储图像数组,分别由

x
(图像1)和
o
(图像2)表示,我们将有:

应用1:

[[[x 0]  [x 0]  [x 0]  [x 0]  [x 0]] [[x 0]  [x 0]  [x 0]  [x 0]  [x 0]] [[x 0]  [x 0]  [x 0]  [x 0]  [x 0]]]

因此,在内存空间中,将是:

[x,o,x,o,x,o..]
遵循行优先顺序。

App2:

[[x x x x x] [x x x x x] [x x x x x] [o o o o o] [o o o o o] [o o o o o]]

因此,在内存空间中,它将为:

[x,x,x,x,x,x...o,o,o,o,o..]

App3:

[[[x x x x x]  [x x x x x]  [x x x x x]] [[o o o o o]  [o o o o o]  [o o o o o]]]

因此,在存储空间上,它将与前一个相同。


B部分:从磁盘读取图像作为数组

现在,关于读取图像的部分,我已经看到OpenCV的

imread
速度要快得多。

作为测试,我从Wiki页面下载了Mona Lisa的图像,并测试了图像读取的性能-

import cv2 # OpenCVIn [521]: %timeit io.imread('monalisa.jpg')100 loops, best of 3: 3.24 ms per loopIn [522]: %timeit cv2.imread('monalisa.jpg')100 loops, best of 3: 2.54 ms per loop


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/651375.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号