Skip to main content
 首页 » 编程设计

python之绘制人口稀少的二维 numpy 数组

2025年05月04日8JustinYoung

通过递减步长的迭代图像模式搜索,我得到了一个“质量”数组。由于搜索模式的性质,数组未完全填充。在第一次迭代中,我使用步长 10,找到最佳点,然后搜索 +-10 XY 范围以找到真正的最佳点。因此,阵列的大部分区域每第 10 个槽都被填充,并且有一个小的“最佳”区域被密集填充。现在我想绘制这个数组,并希望通过每 10 个插槽使用数据在需要的地方“插值”该图。现在进行搜索,我用一个巨大的值初始化数组。我所有的测量值都较小,后来我使用了 np.argmin(q) 函数。这对于搜索来说效果很好,但对于绘图来说却很糟糕。绘图的动态范围丢失。

这是旧版本代码的一个例子,它进行了详尽但不必要的长搜索:

这是我通过优化搜索得到的结果:

这是绘制绘图的代码片段。 (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]) 

但是二维插值失败了。 (至少如情节所示)

我尝试添加代码来执行 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]) 

但结果仍然损坏。

最好的, 格特

请您参考如下方法:

您可以轻松地用 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