Julia:数组是否包含特定的子数组

Nic*_*ler 4 arrays sub-array julia

在julia中,我们可以检查数组是否包含值,如下所示:

> 6 in [4,6,5]
true
Run Code Online (Sandbox Code Playgroud)

但是,当尝试按特定顺序检查子数组时,这将返回false:

> [4,6] in [4,6,5]
false
Run Code Online (Sandbox Code Playgroud)

验证数组中是否存在特定子数组的正确语法是什么?

rod*_*ece 8

我认为值得一提的是,在 Julia 1.0 中你有这个功能 issubset

> issubset([4,6], [4,6,5])
true
Run Code Online (Sandbox Code Playgroud)

你也可以很方便地使用\subseteq乳胶符号来称呼它

> [4,6] ? [4,6,5]
true
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来非常优化:

> using Random

> x, y = randperm(10^3)[1:10^2], randperm(10^3);

> @btime issubset(x, y);
16.153 ?s (12 allocations: 45.96 KiB)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,子集与[子数组](https://en.wiktionary.org/wiki/subarray)不同。`[6,4]` 不是 `[4,6,5]` 的子数组。 (3认同)

Sco*_*nes 7

创建一个性能良好的函数需要一些代码,但这比issubvec上面的版本要快得多:

function subset2(x,y)
    lenx = length(x)
    first = x[1]
    if lenx == 1
        return findnext(y, first, 1) != 0
    end
    leny = length(y)
    lim = length(y) - length(x) + 1
    cur = 1
    while (cur = findnext(y, first, cur)) != 0
        cur > lim && break
        beg = cur
        @inbounds for i = 2:lenx
            y[beg += 1] != x[i] && (beg = 0 ; break)
        end
        beg != 0 && return true
        cur += 1
    end
    false
end
Run Code Online (Sandbox Code Playgroud)

注意:如果函数实际返回子数组的开头位置(如果找到),则更有用,如果不是,则返回0,类似于findfirst/findnext函数.

时间信息(第二个是使用我的subset2函数):

  0.005273 seconds (65.70 k allocations: 4.073 MB)
  0.000086 seconds (4 allocations: 160 bytes)
Run Code Online (Sandbox Code Playgroud)


Dan*_*etz 6

对于第三个条件,即向量[4,6]出现为4,6,5以下函数的子向量:

issubvec(v,big) = 
  any([v == slice(big,i:(i+length(v)-1)) for i=1:(length(big)-length(v)+1)])
Run Code Online (Sandbox Code Playgroud)

对于第二个条件,即为elsvector 中出现的每个元素提供一个布尔值,set建议如下:

function vecin(els,set)
  res = zeros(Bool,size(els))
  res[findin(els,set)]=true
  res
end
Run Code Online (Sandbox Code Playgroud)

使用 OP 中的向量,结果如下:

julia> vecin([4,6],[4,6,5])
2-element Array{Bool,1}:
 true
 true

julia> issubvec([4,6],[4,6,5])
true
Run Code Online (Sandbox Code Playgroud)