#python #numpy
Вопрос:
У меня есть два 1-D массива, отсортированных по numpy, A и B. Для каждого элемента в A я хочу проверить, есть ли в B такой элемент, который
abs(a-b) <= 10
и сохраняйте только те элементы, которые соответствуют условию.
Есть ли способ сделать это без циклов?
Массивы не обязательно имеют одинаковую длину, и идентификатор элемента, который ближе всего к A в B, может быть далек от исходного идентификатора в A. В противном случае я мог бы использовать что-то вроде
A[(A >= B - 10) amp; (A <= B 10)]
Я не возражаю против использования большого пространства, поэтому я могу создать 2 новых массива размером B[-1] и использовать элементы в A,B в качестве индексов, где в новых массивах есть 1, но я также не могу придумать решение без циклов. Думал об использовании np.lib.stride_tricks.as_strided, но не уверен, как это сделать.
Спасибо.
Ответ №1:
Это должно сделать это:
answer = a[np.sum(abs(a.reshape(a.shape[0], 1) - b) <= 10,axis=-1) > 0]
Ответ №2:
Вы можете использовать np.isclose
с широковещательной B
A[np.isclose(A, B[:, None], atol=10).any(0)]