2015-10-19 44 views
1

從迭代圖像模式搜索與減少步長我有一個'質量'數組。由於搜索模式的性質,數組未被完全填充。在第一次迭代中,我使用步長10來找到最佳點,然後搜索+ -10 XY範圍以找到真正的最佳點。因此,陣列中的大多數陣列都會填充第10個插槽,並且存在密集填充的小「最佳」區域。現在我想繪製這個數組,並希望通過每隔10個插槽使用數據,在需要的地方「繪製」插圖。現在執行我的搜索,我用一個巨大的值初始化數組。我所有的測量值都較小,後來我使用np.argmin(q)功能。這對於搜索很好,但對於繪製它是不好的。情節的動態範圍丟失。繪製人口稀少的二維numpy陣列

這裏是從舊版本,做詳盡的,但不必要的長時間的搜索代碼的例子:

enter image description here

這裏是我所得到的與優化的搜索:

enter image description here

這是一塊能夠做圖的代碼。 (q是要繪製的質量數組)

fig= plt.figure(1) 
im= plt.imshow(q[::-1], cmap='rainbow', interpolation='none', extent=[-search_size,search_size,-search_size,search_size]) 
fig.savefig(pfn(img_fn), bbox_inches='tight') 

該問題可能指向數組的初始化。再次爲我做的最小搜索我這樣做:

q = np.empty(shape=(2*search_size,2*search_size)) 
q.fill(+1e20) 

q_min = 1e20 

for xs in range(-search_size,+search_size,search_step): 
    for ys in range(-search_size,+search_size,search_step): 
     img_shift = np.zeros_like(img) 
     img_shift[mom(ys):non(ys), mom(xs):non(xs)] = img[mom(-ys):non(-ys), mom(-xs):non(-xs)] 
     d = np.absolute(img_shift - prev_img)[search_size:-search_size,search_size:-search_size] 
     q[ys+search_size,xs+search_size] = np.sum(d) 
     if q[ys+search_size,xs+search_size] < q_min : q_min= q[ys+search_size,xs+search_size] 
     #print '1st iter try : %+3d %+3d %6.3f %6.3f' % (xs, ys, q[ys+search_size,xs+search_size], q_min) 

idxmin = np.argmin(q) 
dy,dx = np.unravel_index(idxmin, q.shape) 
dx= dx-search_size 
dy= dy-search_size 
print '1st iter best : dx= %+3d dy= %+3d' % (dx , dy) 

然後接着用search_step = 1另一個循環。

是否可以初始化數組,即NaN?這將允許最低限度的搜索?和/或它會允許繪圖儀跳過未定義的條目?

那麼初始化/繪圖的最佳方式是什麼,以便搜索起作用,並且情節看起來不錯?

謝謝, 格特


更新@Nix G-d

平均化失敗。我首先根據建議嘗試了代碼。

q_int = pd.DataFrame(q).interpolate(method='linear', axis=0).values 
fig= plt.figure(1) 
im= plt.imshow(q_int[::-1], cmap='rainbow', interpolation='none', extent=[-search_size,search_size,-search_size,search_size]) 

但是2D插值失敗。 (至少如由曲線圖表示)

enter image description here

我試圖添加代碼以執行X和Y內插。

q_int = pd.DataFrame(q).interpolate(method='linear', axis=0).values 
q_int = pd.DataFrame(q_intx).interpolate(method='linear', axis=1).values 
fig= plt.figure(1) 
im= plt.imshow(q_int[::-1], cmap='rainbow', interpolation='none', extent=[-search_size,search_size,-search_size,search_size]) 

但結果仍然損壞。

enter image description here

最佳, 格特

回答

-1

你可以很容易的NaN數組初始化:

shape = (2*search_size, 2*search_size) 
q = np.full(shape, np.nan) 

這可以被搜索到正常。爲了找到忽略NaN的最低指標,則可以使用np.nanargmin()

In [12]: np.nanargmin([1,-1,4,float('nan')]) 
Out[12]: 1 

爲了擺脫這些NaN值,我們可以使用,pandas.DataFrame.interpolate()的:

q_interpolated = pd.DataFrame(q).interpolate(method='linear', axis=0).values 
+0

更新@Nix G-d 的平均失敗。請參閱上面的附加問題。 –