我想在Julia中使用一个函数(我确定有一个),该函数将Array(或类似类型)和类型(例如,无)作为输入,检查数组中的每个元素是否element属于该类型,并返回Array中属于该类型的元素的索引。例如:
typeToFind = nothing
A = [1,2,3,nothing,5]
idx = find(x->x == typeToFind,A)
基本上类似于MATLAB。我发现了一些使用find
的建议,但是似乎不建议使用它-朱莉娅在尝试使用它时抱怨。我想茱莉亚一定有这种功能,尽管我当然可以编写一些非常快速的代码来完成上述工作。
答案 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)
find
被findall
取代,所以您应该尝试:
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