在朱莉娅的[1,2,0,0,4,0]中查找非零元素的索引,并用它们创建一个Arrray

时间:2017-02-14 17:22:55

标签: julia

我知道有一个功能可以做到这一点,例如:

A = [1,2,0,0,4,0]
find(A)

 3-element Array{Int64,1}:
 1
 2
 5

我想按照自己的方式去做,但是,我被困在这里

for i=1:endof(A)
   if A[i] != 0
      []
   end
end

提前致谢。

3 个答案:

答案 0 :(得分:5)

这是另一种选择:

function myfind(c)
    a = similar(c, Int)
    count = 1
    @inbounds for i in eachindex(c)
        a[count] = i
        count += (c[i] != zero(eltype(c)))
    end
    return resize!(a, count-1)
end

对于我测试的所有案例,它实际上都超过find,但是对于您发布的非常小的示例向量,差异可以忽略不计。避免分支和动态增长索引数组可能有一些性能优势。

答案 1 :(得分:2)

我注意到这个问题确实很混乱(因为制定不当,对此感到抱歉)。因此,有两种可能的答案:一种是[1,2,4],它是一个非零元素的数组;另一个是[1,2,5],它是非零元素索引的数组。

让我们从第一个选项

开始
A = [1,2,0,0,4,0]
B = []

for i=1:endof(A)
    if A[i] != 0
        push!(B,i)
    end
end
println(B)

输出为Any[1,2,5]

但是,这种类型不是我想要的那种。使用typeof(B)它会显示Array{Any,1},因此我添加了以下代码:

B = Array{Int64}(B)
println(B)
typeof(B)

结果是理想的

[1,2,5]
Array{Int64,1}

为了提高效率,按照评论中的建议,我在循环之前使用eltype()函数指定了B的类型,如下所示:

A1 = [1,2,0,0,4,0] #The default type is Array{Int64,1}
B1 = eltype(A1)[] #Define the type of the 0 element array B with the type of A
#B1 = eltype(typeof(A))[] this is also valid
for i=1:endof(A1)
    if A1[i] != 0
        push!(B1::Array{Int64,1},i::Int64)
    end
end
println(B1)
typeof(B1)

然后,输出再次是所需的

[1,2,5]
Array{Int64,1}

最简单的方法是使用函数find()。但是,由于我是初学者,我想以另一种方式做到这一点。但是,@ DNF提供的另一个替代方案在测试它的情况下表现优于find()(见下面的答案)。

其他用户(@Harrison Grodin和@P i)在本次讨论中提供了第二个选项,它创建了一个非零元素的输出矩阵。

感谢各位的帮助!

答案 2 :(得分:2)

你有几个选择。

使用您开始使用的策略,您可以在push!循环中使用for

julia> B = Int[]
0-element Array{Int64,1}

julia> for element = A
           if element != 0
               push!(B, element)
           end
       end

julia> B
3-element Array{Int64,1}:
 1
 2
 4

您也可以选择使用短路评估。

julia> for element = A
           element != 0 && push!(B, element)
       end

julia> for element = A
           element == 0 || push!(B, element)
       end

filter和列表推导都是有效的!

julia> B = [element for element = A if element != 0]
3-element Array{Int64,1}:
 1
 2
 4

julia> filter(n -> n != 0, A)
3-element Array{Int64,1}:
 1
 2
 4

编辑:感谢OP的评论,我意识到所需的结果是非零元素的 indices ,而不是元素本身。这可以通过以下方式简单地实现。 :)

julia> find(A)
3-element Array{Int64,1}:
 1
 2
 5