我有这个数据立方体包含图像每个像素的数据(非常像高光谱成像)。 我试图以有效的方式在图像的每个像素上插入一条线。 现在,我这样做:
我的datacube是一个6X1024x1024 numpy数组,我有另一个包含我数据的自变量的变量。
map = np.zeros((1024,1024))
for i in np.mgrid[1:1024]:
for j in np.mgrid[1:1024]:
x = independent_variable # This is my independent variable
y = spec_cube[:,i,j] # The Y data to be fitted is the power at each scale, for a pixel
index = polyfit(x,y,1) # Outputs the slope and the offset
map[i,j] = index[0] # The pixel value is the index
我知道嵌套for循环通常是最糟糕的事情,但我想不出更好的方法。
我尝试了以下但是它给出了这个错误:“ValueError:解压缩的值太多了”
map = np.zeros((1024,1024))
for i,j in map:
x = independent_variable # This is my independent variable
y = spec_cube[:,i,j] # The Y data to be fitted is the power at each scale, for a pixel
index = polyfit(x,y,1) # Outputs the slope and the offset
map[i,j] = index[0] # The pixel value is the index
答案 0 :(得分:5)
加快速度的一种方法:使用itertools.product
:
for (i, j) in itertools.product(np.mgrid[1:1024], np.mgrid[1:1024]):
... stuff ...
改进(Python 2.7.1):
In [2]: def multiline(): ...: for i in np.mgrid[1:1024]: ...: for j in np.mgrid[1:1024]: ...: pass ...: In [3]: def single_line(): ...: for i, j in product(np.mgrid[1:1024], np.mgrid[1:1024]): ...: pass ...: In [4]: from itertools import product In [5]: %timeit multiline() 10 loops, best of 3: 138 ms per loop In [6]: %timeit single_line() 10 loops, best of 3: 75.6 ms per loop
答案 1 :(得分:3)
由于循环内部的操作是找到一条直线的斜率,所以我采用了一种不太精确的方法,但是使用了数组运算。基本上,找到我所做的斜率:每个相邻点的ΔY/ΔX,然后平均所有斜率。
原来只需要几分之一秒。
这是新代码:
map = np.zeros((spec_cube.shape[1],spec_cube.shape[2])) # This will be the power index map
x = scale_array
for i in np.mgrid[1:spec_cupe.shape[0]]:
spec_cube[i-1] = (spec_cube[i]-spec_cube[i-1])/(scale_array[i]-scale_array[i-1])
map += spec_cube[i-1]
map /= (spec_cube.shape[0]-1)
我的剧本从420s变为9.66s!