我有一个'质量'数组。由于搜索模式的性质,阵列未完全填充。在第一次迭代中,我使用步长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])
但结果仍然被破坏了。
最佳, 格特
答案 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