【问题标题】:Plot sparsely populated 2d numpy array绘制稀疏填充的 2d numpy 数组
【发布时间】:2015-10-19 05:07:14
【问题描述】:

从具有递减步长的迭代图像模式搜索中,我有一个“质量”数组。由于搜索模式的性质,该数组未完全填充。在第一次迭代中,我使用步长 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])

但是 2D 插值失败。 (至少如图所示)

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

但结果仍然损坏。

最好, 格特

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案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
    

    【讨论】:

    • 更新@Nix G-D 平均失败。请参阅上面的附加问题。
    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 2020-11-05
    • 2013-11-10
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2021-12-11
    • 2019-12-05
    相关资源
    最近更新 更多