#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
, если они находятся в пределах допуска. Для ваших фиктивных данных я получаю результат, который вы просили