Проблема в том, что вы повторяете себя для каждой переменной;индексация, если объект является массивом, в противном случае используется объект напрямую.Я бы использовал здесь служебную функцию:
def threshold_label(ob, i):
# the threshold label can be a scalar or an array
return ob[i] if isinstance(ob, numpy.ndarray) else ob
for label in range(num_labels):
d_tresh = threshold(drop_treshold, label)
r_tresh1 = threshold(relabel_treshold1, label)
r_tresh2 = threshold(relabel_threshold2, label)
Обратите внимание, что я использовал isinstance()
для проверки типа каждого объекта, см. В чем различия между типом() и isinstance ()?
Другой вариант - не проверять массивы каждую итерацию .Проверьте один раз, и, если это не массив, превратите скалярное значение с плавающей запятой или значение int в последовательность ожидаемой длины:
# turn scalar labels into sequences for easy iteration
if not isinstance(drop_threshold, numpy.ndarray):
drop_threshold = [drop_threshold] * num_labels
if not isinstance(relabel_treshold1, numpy.ndarray):
relabel_treshold1 = [relabel_treshold1] * num_labels
if not isinstance(drop_threshold, numpy.ndarray):
relabel_treshold2 = [relabel_treshold2] * num_labels
или, опять же, с помощью вспомогательной функции:
def ensure_sequence(ob, cnt):
# turn a scalar label value into a sequence if needed
return [ob] * cnt if not isinstance(ob, numpy.ndarray) else ob
drop_threshold = ensure_sequence(drop_threshold, num_labels)
relabel_treshold1 = ensure_sequence(relabel_treshold1, num_labels)
relabel_treshold2 = ensure_sequence(relabel_treshold2, num_labels)
В этот момент вы можете использовать zip()
для итерации:
labels = zip(drop_threshold, relabel_threshold1, relabel_threshold2)
for d_thresh, r_thresh1, r_thresh2 in labels:
# ...