绘制稀疏填充的2d numpy数组

时间:2015-10-19 05:07:14

标签: python numpy matplotlib

从具有递减步长的迭代图像模式搜索

我有一个'质量'数组。由于搜索模式的性质,阵列未完全填充。在第一次迭代中,我使用步长10,找到最佳点并在那里搜索+ -10 XY范围以找到真正的最佳点。因此大多数阵列都填充了第10个插槽,并且有一个密集填充的小“最佳”区域。现在我想绘制这个数组,并希望通过每隔10个插槽使用数据来在需要的地方“插值”。现在做我的搜索我用一个巨大的值初始化数组。我的所有测量值都较小,后来我使用np.argmin(q)函数。这适用于搜索,但绘制它很糟糕。情节的动态范围丢失了。

以下是旧版本代码的示例,该代码执行详尽但不必要的长搜索:

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 个答案:

答案 0 :(得分:-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