2011-01-24 9 views
0
def _closest_to(self, vals, x): 
    ''' returns the value in vals closest to x ''' 
    closest = vals[0] 
    closest_dist = abs(x-closest) 
    for val in vals[1:]: 
     cur_dist = abs(x-closest) 
     if cur_dist < closest_dist: 
      closest = x 
      closest_dist = cur_dist 
    return closest 
+0

Сообщение с отступом и форматированием кода? – payne

+0

Так как в python вдавливание имеет значение, доброжелательно отступывайте свой код и используйте «Code Sample» {}. – log0

+0

Связанный: http://stackoverflow.com/questions/9845292/converting-matlab-to-python?rq=1 –

ответ

6

Используя min с абсолютной разницей, вы получите индекс наименьшей разницы в качестве второго выходного аргумента. Затем вы можете использовать этот индекс для поиска ближайшего значения.

Вы вызываете функцию как closestValue = closest_to(values,target)

function closest = closest_to(vals,x) 
%#CLOSEST_TO returns the value in vals closest to X 

delta = abs(vals-x); 
[~,minIdx] = min(delta); 
closest = vals(minIdx); 

Если вы хотите сохранить строку, кода, можно заменить две последние строки с

closest = vals(delta == min(delta)); 

, где логическое сравнение создает логический вектор с 1, где дельта принимает наименьшее значение. Обратите внимание, что обе версии кода возвращают массив значений для closest, если есть связь для ближайшего значения в vals.

+2

Один случай, когда функциональный код matlab гораздо читабельнее, чем императивный питон для цикла. – nimrodm

+1

@nimrodm - для чего это стоит, сопоставимый код в python (используя numpy) по существу идентичен приведенному выше примеру Matlab. –

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