来自R的match()帮助页面:
描述:
__PRE__
也就是说,我可以给出两个向量,match(v1,v2)返回一个向量,其中第i个元素是v1 [i]出现在v2中的索引.
朱莉娅有这么类似的功能吗?我找不到它了.
这听起来像你正在寻找indexin
(就像搜索饲料,这也是ismember
由Matlab 调用).它略有不同:它返回一个向量,其中第i个元素是出现的最后一个索引.v1[i]
v2
julia> v1 = [8,6,7,11]; v2 = -10:10;
idxs = indexin(v1, v2)
4-element Array{Int64,1}:
19
17
18
0
Run Code Online (Sandbox Code Playgroud)
对于v1
未出现的元素的索引,它返回零v2
.所以,你可以在"重建"的部分v1
是在v2
简单地通过非零指数索引:
julia> v2[idxs[idxs .> 0]]
3-element Array{Int64,1}:
8
6
7
Run Code Online (Sandbox Code Playgroud)
如果你看一下实现,你会发现它使用字典来存储和查找索引.这意味着,它才有一个越过v1
和v2
每个,而不是通过搜索v2
用于每个元素v1
.它几乎在所有情况下都应该更有效率.
如果匹配R的行为并返回第一个索引很重要,我们就可以完成基本实现,只需向后构建字典,以便较低的索引覆盖较高的索引:
function firstindexin(a::AbstractArray, b::AbstractArray)
bdict = Dict{eltype(b), Int}()
for i=length(b):-1:1
bdict[b[i]] = i
end
[get(bdict, i, 0) for i in a]
end
julia> firstindexin([1,2,3,4], [1,1,2,2,3,3])
4-element Array{Int64,1}:
1
3
5
0
julia> indexin([1,2,3,4], [1,1,2,2,3,3])
4-element Array{Int64,1}:
2
4
6
0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
430 次 |
最近记录: |