针对数组B
中的每个值,如何通过一个函数调用找到数组A
中最接近该值的值,类似于numpy中的searchsorted(A, B)
函数。
针对数组B
中的每个值,如何通过一个函数调用找到数组A
中最接近该值的值,类似于numpy中的searchsorted(A, B)
函数。
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
此处(基于Python的从0开始的索引)等同。
解释:
searchsortedfirst.(Ref(A),B)
是什么意思?
句点告诉Julia要广播searchsortedfirst
调用。但是,我们必须确保在每个调用中A
仍然被视为一个数组(我们希望A
在广播下仍然是一个标量)。这可以通过将A
包装在Ref
中来实现。
searchsortedfirst
可能会返回超出边界的索引。 - Bogumił KamińskiA
和 B
交换了?至少根据问题中的解释是这样的吧? - DNFB
是未排序的(但是您也不能在numpy中使用searchsorted
),您可以执行以下操作:[argmin(abs(a .- B)) for a in A]
B
是已排序的,并且您接受在数组 B
中找不到最接近的值(searchsorted
找不到最接近的值),您可以编写以下代码:searchsorted.(Ref(B), A)
您将获得应将A
元素放置在B
中的范围(您还可以查看searchsortedfirst
和searchsortedlast
函数)。
B
是排序的,并且(大约)比0.1*length(A)
大,那么使用一种同时循环A
和B
的算法会获得更好的性能。同时循环两个数组的操作次数比对searchsortedfirst
进行length(B)
次二分查找要少。 - Colin T Bowers