Python выбирает значения, которые близки друг к другу со значениями в обоих массивах

#python #arrays #list #match

Вопрос:

У меня есть два массива.

 org_df = [2732.64, 2296.35, 1262.28, 567.6, 436.29, 262.98, 238.74, 210.38,19] calc_df = [19, 2296.34, 436.3, 2732.64]  

Я хочу сравнить эти массивы и создать новый массив с теми же элементами и с допуском 0,01.

 new_list = [2732.64, 2296.35 ,436.29,19]  

Я добавил код, но он не работает:

изображение, показывающее код

Комментарии:

1. В вашем коде ваше утверждение if всегда верно, так как абсолютная разница всегда gt;=0,01 или gt;

Ответ №1:

Вы можете сделать это с numpy isclose помощью функции модуля.

 new_list = [i for i in org_df if np.any(np.isclose(i, calc_df, atol=0.01))]  

Комментарии:

1. спасибо вам за вашу помощь

Ответ №2:

Если вы используете numpy :

 org_df = np.array([2732.64, 2296.35, 1262.28, 567.6, 436.29, 262.98, 238.74, 210.38,19]) calc_df = np.array([19, 2296.34, 436.3, 2732.64])  new_list = org_df[np.any(np.abs(org_df - calc_df[:, None]) lt;= 0.01, axis=0)] print(new_list)  # Output: array([2732.64, 2296.35, 436.29, 19. ])  

Ответ №3:

Если вы не хотите использовать такую зависимость, как numpy, вы можете сделать это, используя понимание списка и сравнение диапазонов pythons awesome. Python довольно хорош для этого!

 diff = abs(tolerance) new_list = [y for x in org_df for y in calc_df if (y-diff lt;= x lt;= y diff)]  

Дает точный результат. Хотя это может быть медленнее, чем массив numpy.

Ответ №4:

Чтобы избежать добавления такой зависимости, как numpy, вам нужно выполнить итерацию по обоим спискам и сделать что-то вроде этого:

 new_list = [] for a in org_df:  for b in calc_df:  if -0.01 lt; a - b lt; 0.01:  new_list.append(a)  

И если вы хотите вместо этого использовать понимание списка, используйте этот лайнер:

 new_list = [a for a in org_df for b in calc_df if -0.01 lt; a - b lt; 0.01]  

Комментарии:

1. спасибо за вашу помощь, но этот метод выбирает только те же значения

2. Я не уверен, что понял ваш вопрос тогда, это вычитает значения и добавляет их new_list , если они находятся в пределах допуска. Для ваших фиктивных данных я получаю результат, который вы просили