仅获取一个数组中存在于另一数组中的元素

Jar*_*ier 3 julia

我正在从 Python 学习 Julia。我想获取数组的元素,b使得每个元素都在 array 中a。我在 Julia 中的尝试是在 python 中完成我需要的操作后显示的。我的问题是:在 Julia 中是否有更好/更快的方法来做到这一点?我对我在 Julia 中编写的内容的简单性感到怀疑,并且担心这样一个看似幼稚的解决方案可能具有次优的性能(同样来自 Python)。

Python:

import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([7, 8, 2, 3, 5])
indices_b_in_a = np.nonzero(np.isin(b, a))
b_in_a = b[indices_b_in_a]
# array([2, 3])
Run Code Online (Sandbox Code Playgroud)

朱莉娅:

a = [1, 2, 3, 4];
b = [7, 8, 2, 3, 5];
indices_b_in_a = findall(ele -> ele in a, b);
b_in_a = b[indices_b_in_a];
#2-element Vector{Int64}:
# 2
# 3
Run Code Online (Sandbox Code Playgroud)

Sha*_*yan 5

也许这会是一个有用的答案:

\n
julia> intersect(Set(a), Set(b))\nSet{Int64} with 2 elements:\n  2\n  3\n\n# Or even\njulia> intersect(a, b)\n2-element Vector{Int64}:\n 2\n 3\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,如果您有重复的数字,则此方法无法完全复制您的预期行为,因为我在这里处理唯一值!如果有重复的元素,应该替换为逐元素的搜索方法!在这种情况下,使用二分搜索将是一个不错的选择。
\n另一种方法是在 Julia 中使用广播:

\n
julia> a = rand(1:100, 1000);\n       b = rand(1:3000, 5000);\n\njulia> b[in.(b, Ref(a))]\n161-element Vector{Int64}:\n  8\n  5\n 70\n 73\n  \xe2\x8b\xae\n\n# Exactly the same approach with a slightly different syntax\njulia> b[b.\xe2\x88\x88Ref(a)]\n161-element Vector{Int64}:\n  8\n  5\n 70\n 73\n 30\n 63\n 73\n  \xe2\x8b\xae\n
Run Code Online (Sandbox Code Playgroud)\n

问:Ref上面代码块中的作用是什么?
\n Ans:通过包装aRef我可以在广播过程中Ref记录a并防止编译器进行迭代。a否则,它将尝试同时迭代a和的元素b,这不是正确的解决方案(即使两个对象具有相同的长度)。
\n然而,Julia 的语法是特定的(通常),但并没有那么复杂。我这么说是因为你提到:

\n
\n

我担心这样一个看起来幼稚的解决方案......

\n
\n

最后但并非最不重要的一点是,如果您想在 Julia 中获得良好的性能,请不要忘记将代码包装在函数中。

\n