Учитывая 2 numpy 1-D отсортированных массива, проверьте для каждого элемента в A, есть ли элемент в B такой, что abs(a-b)

#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)]