Юлия: векторизованная версия поиска - PullRequest
2 голосов
/ 25 марта 2019

Для каждого значения в массиве B, как найти ближайшее значение в массиве A с помощью одного вызова функции, аналогично тому, как searchsorted(A, B) работает в numpy.

Ответы [ 2 ]

2 голосов
/ 25 марта 2019
searchsortedfirst.(Ref(A),B)

должен дать вам желаемый результат.Пример:

julia> A = [1, 2, 2, 4, 4, 4, 4, 4, 9, 10];

julia> B = [10, 6, 9];

julia> searchsortedfirst.(Ref(A), B)
3-element Array{Int64,1}:
 10
  9
  9

Сравнить с np.searchsorted:

julia> using PyCall

julia> np = pyimport("numpy");

julia> np.searchsorted(A,B)
3-element Array{Int64,1}:
 9
 8
 8

, что (до индексации на основе 0 в Python) эквивалентно.

Объяснение: Что делает searchsortedfirst.(Ref(A),B)?

Точка указывает Джулии на передачу вызова searchsortedfirst.Однако мы должны убедиться, что A все еще обрабатывается как массив в каждом вызове (мы хотим, чтобы A был скаляром при широковещании).Это может быть достигнуто путем упаковки A в Ref.

1 голос
/ 25 марта 2019

Предполагая, что B не отсортировано (но вы также не можете использовать searchsorted в numpy), вы можете сделать:

[argmin(abs(a .- B)) for a in A]

Если B отсортирован, и вы принимаете, что не нашлиближайшее значение в массиве B (searchsorted не находит ближайшее значение), которое вы можете написать:

searchsorted.(Ref(B), A)

, и вы получите диапазоны, в которых элементы A должны быть помещены в B(Вы также можете проверить функции searchsortedfirst и searchsortedlast)

...