在Julia

时间:2019-04-15 15:19:32

标签: arrays julia

我想在Julia中使用一个函数(我确定有一个),该函数将Array(或类似类型)和类型(例如,无)作为输入,检查数组中的每个元素是否element属于该类型,并返回Array中属于该类型的元素的索引。例如:

    typeToFind = nothing
    A = [1,2,3,nothing,5]
    idx = find(x->x == typeToFind,A)

基本上类似于MATLAB。我发现了一些使用find的建议,但是似乎不建议使用它-朱莉娅在尝试使用它时抱怨。我想茱莉亚一定有这种功能,尽管我当然可以编写一些非常快速的代码来完成上述工作。

2 个答案:

答案 0 :(得分:1)

使用findall(x->typeof(x)==Nothing, A)解决了该问题,但对于某些类型x->isa(x, T)使用T可能会更好。这样做的原因是typeof(x)不能返回抽象类型,因为typeof(x)总是返回一个具体类型。

这是一个用例:

A = Any[1,UInt8(2),3.1,nothing,Int32(5)]

findall(x->isa(x, Int), A)
1-element Array{Int64,1}:
 1

findall(x->isa(x, UInt8), A)
1-element Array{Int64,1}:
 2

findall(x->isa(x, Integer), A)  # Integer is an abstract type
3-element Array{Int64,1}:
 1
 2
 5

findall(x->typeof(x)==Integer, A)
0-element Array{Int64,1}   # <- Doesn't work!

它似乎也更快:

julia> @btime findall(x->typeof(x)==Nothing, $A)
  356.794 ns (6 allocations: 272 bytes)
1-element Array{Int64,1}:
 4

julia> @btime findall(x->isa(x, Nothing), $A)
  120.255 ns (6 allocations: 272 bytes)
1-element Array{Int64,1}:
 4

答案 1 :(得分:0)

findfindall取代,所以您应该尝试:

julia> findall(x->typeof(x)==Nothing, A)

## which returns:
1-element Array{Int64,1}:
4

julia> findall(x->typeof(x)==Nothing, A)

## which returns:
4-element Array{Int64,1}:
1
2
3
5