我正在通过numpy / python将单独的tiff堆叠成单个3D数组。当文件被读取并插入某个变量时,速度会随文件数量线性变化,例如,加载100个文件需要0.2秒,加载1000个文件需要2.46秒等等。
然而,当我尝试从这些文件中创建3D堆栈时,使用 dstack()时间开始非线性缩放,例如10个文件为0.21秒,100个文件为5.39秒,依此类推。
我意识到减速是由dstack()背后的一些魔法引起的。从一组图像文件创建3D堆栈的最佳方法是什么?
如果我不使用dtack(),但预先创建3D阵列然后填充它,脚本运行得更快,但仍然非线性缩放(10秒为0.2秒,100秒为2.2秒,1000张图像为40秒) ) 本案的代码:
import numpy as np
from PIL import Image
import time
import random
def toc(t):
return time.time() - t
i_max = 1000
t = time.time()
for i in range(0,i_max):
fname = r"..\Pos0\img_"+("%09d"%i)+"_Default_000.tif"
im = np.array(Image.open(fname))
if i>0:
stack[:,:,i] = im
else:
s = im.shape
stack = np.empty((s[0],s[1],i_max))
stack[:,:,0] = im
print toc(t)
PS:Python 2.7.8 Anaconda 2.1,Intel i5 @ 32GB RAM,从4条纹HDD中读取
答案 0 :(得分:4)
您可以通过更改索引的顺序来解决此问题,从而使图像索引成为第一位。像这样:
i_max = 1000
sx, sy = 1000,1000
t = time.time()
for i in range(0,i_max):
im = np.ones((sx,sy))
if i>0:
#stack[:,:,i] = im
stack[i,:,:] = im
else:
#stack = np.empty((sx,sy,i_max))
#stack[:,:,0] = im
stack = np.empty((i_max, sx, sy))
stack[0,:,:] = im
print toc(t)
我得到的时间是:
4.44851183891 # original order, i_max = 100
118.510767937 # original order, i_max = 1000
1.78239989281 # modified order, i_max = 100
23.4904351234 # modified order, i_max = 1000
我认为这样做的原因是数据不是逐位处理的,而是以固定大小的块进行处理,而不管每个块中实际使用了多少数据。使用原始订单时,块没有得到有效使用。例如,请参阅此视频的前几分钟:https://vimeo.com/97337258也就是说,它不是关于RAM而是CPU缓存。