朱莉娅语言:searchsorted 的向量化版本

4

针对数组B中的每个值,如何通过一个函数调用找到数组A中最接近该值的值,类似于numpy中的searchsorted(A, B)函数。


1
你已经收到了两个好答案。我只想指出,如果 B 是排序的,并且(大约)比 0.1*length(A) 大,那么使用一种同时循环 AB 的算法会获得更好的性能。同时循环两个数组的操作次数比对 searchsortedfirst 进行 length(B) 次二分查找要少。 - Colin T Bowers
2个回答

3
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中来实现。


一针见血。非常感谢你。 - user3055163
这是numpy代码的正确等价形式,但请注意(我在同时编写答案),numpy代码无法找到您想要的内容。特别是searchsortedfirst可能会返回超出边界的索引。 - Bogumił Kamiński
你这里是不是把 AB 交换了?至少根据问题中的解释是这样的吧? - DNF

1
假设B是未排序的(但是您也不能在numpy中使用searchsorted),您可以执行以下操作:
[argmin(abs(a .- B)) for a in A]

如果 B 是已排序的,并且您接受在数组 B 中找不到最接近的值(searchsorted 找不到最接近的值),您可以编写以下代码:
searchsorted.(Ref(B), A)

您将获得应将A元素放置在B中的范围(您还可以查看searchsortedfirstsearchsortedlast函数)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接