我正在从 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)
也许这会是一个有用的答案:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n请注意,如果您有重复的数字,则此方法无法完全复制您的预期行为,因为我在这里处理唯一值!如果有重复的元素,应该替换为逐元素的搜索方法!在这种情况下,使用二分搜索将是一个不错的选择。
\n另一种方法是在 Julia 中使用广播:
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\nRun Code Online (Sandbox Code Playgroud)\n问:Ref上面代码块中的作用是什么?
\n Ans:通过包装a,Ref我可以在广播过程中Ref记录a并防止编译器进行迭代。a否则,它将尝试同时迭代a和的元素b,这不是正确的解决方案(即使两个对象具有相同的长度)。
\n然而,Julia 的语法是特定的(通常),但并没有那么复杂。我这么说是因为你提到:
\n\n我担心这样一个看起来幼稚的解决方案......
\n
最后但并非最不重要的一点是,如果您想在 Julia 中获得良好的性能,请不要忘记将代码包装在函数中。
\n