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


