2015-10-19 4 views
1

из итеративного шаблона изображения с уменьшением размера шага У меня есть «качественный» массив. Из-за характера шаблона поиска массив не заполняется полностью. На первой итерации я иду с шагами 10, нахожу лучшее место и там ищу диапазон +10 XY, чтобы найти истинное лучшее место. Таким образом, у большинства массивов есть каждый 10-й слот, и есть небольшая «лучшая» область, которая плотно заполнена. Теперь я хочу построить этот массив и хочу, чтобы график был «интерполирован» там, где это необходимо, используя данные каждые 10-й слот. Теперь для выполнения поиска я инициализирую массив с огромным значением. Все мои измерения меньше, и позже я использую функцию np.argmin(q). Это отлично подходит для поиска, но для заговора это плохо. Динамический диапазон графика теряется.Участок малонаселенного массива 2d 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? Это позволит минимальный поиск? И/или это позволит плоттеру прыгать через неопределенные записи?

Итак, что является лучшим способом для инициализации/построения графика, чтобы поиск работал, и графики выглядели хорошо?

Спасибо, Герт


Update @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) 

Это может быть поиск в обычном режиме. Для того, чтобы найти минимальные показатели игнорирующие пренебрежимо малых, вы можете использовать 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

Update @Nix G-D Усреднение терпит неудачу. См. Выше, добавьте к вопросу. –

Смежные вопросы