2

我有这个数据立方体,其中包含图像每个像素的数据(非常像高光谱成像)。我试图以一种有效的方式在图像的每个像素上拟合一条线。现在,我这样做:

我的数据立方体是一个 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
4

2 回答 2

5

一种加快速度的方法:使用itertools.product

for (i, j) in itertools.product(np.mgrid[1:1024], np.mgrid[1:1024]):
    ... stuff ...

改进(Python 2.7.1):

在 [2] 中:定义多行():
   ...:对于 np.mgrid[1:1024] 中的 i:
   ...:对于 np.mgrid[1:1024] 中的 j:
   ...: 经过
   ...:        

在 [3] 中: def single_line():
   ...:对于产品中的 i,j(np.mgrid[1:1024],np.mgrid[1:1024]):
   ...: 经过
   ...:    

[4]中:从itertools导入产品

在 [5] 中:%timeit 多行()
10 个循环,3 个循环中的最佳:每个循环 138 毫秒

在 [6] 中:%timeit single_line()
10 个循环,3 个循环中的最佳:每个循环 75.6 毫秒
于 2012-06-07T02:15:14.190 回答
3

由于循环内部的操作是求直线的斜率,因此我采用了一种不太精确的方法,但使用了数组操作。基本上,要找到我所做的斜率:每个相邻点的 delta Y / delta 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)

我的脚本从 420 秒变成了 9.66 秒!

于 2012-06-08T11:51:27.253 回答