Iβm looking for a function (is there is one) where i can get the position of an element in an array? I have a 3D array of numbers and i want to obtain the position (i,j,k)of a particular number (element) in that array. Is there a way to obtain it? Thanks in advance.
The following works on Julia 0.6:
julia> A = rand(1:3, 3, 3, 3)
3Γ3Γ3 Array{Int64,3}:
[:, :, 1] =
2 3 2
2 2 2
2 1 3
[:, :, 2] =
3 3 3
2 1 3
3 1 1
[:, :, 3] =
3 2 1
2 2 2
3 1 1
julia> findall(x->x==2, A)
11-element Array{CartesianIndex{3},1}:
CartesianIndex(1, 1, 1)
CartesianIndex(2, 1, 1)
CartesianIndex(3, 1, 1)
CartesianIndex(2, 2, 1)
CartesianIndex(1, 3, 1)
CartesianIndex(2, 3, 1)
CartesianIndex(2, 1, 2)
CartesianIndex(2, 1, 3)
CartesianIndex(1, 2, 3)
CartesianIndex(2, 2, 3)
CartesianIndex(2, 3, 3)
Thank you for the prompt response. I tried it but i get the following error:
findall(x->x==2, A)
ERROR: UndefVarError: findall not defined
Apratently i dont have that function. When i look the function it tells me:
Binding findall does not exis
findall
is the name in version 0.7. In version 0.6 you just use find
instead.
I used find and i get the following:
find(x->x==2, A)
10-element Array{Int64,1}:
1
5
10
11
12
14
17
19
26
27
What i need is the position (CartesianIndex). What am I doing wrong?
β¦i want to obtain the position (i,j,k)of a particular number (element) in that array.
ind2sub(A, find(A .== 2))
EDIT (for v0.6)
i, j, k = ind2sub(A, find(x->x == 2,A))
idx = [i j k]
Is there a mode for findall()
in 0.7 which works with linear indices?
It is normally preferable to use find(x->x==2, A)
over find(A.==2)
.
You can convert, something like
julia> v = rand(3,3);
julia> C = findall(x->x>0.5, v)
5-element Array{CartesianIndex{2},1}:
CartesianIndex(2, 1)
CartesianIndex(2, 2)
CartesianIndex(3, 2)
CartesianIndex(2, 3)
CartesianIndex(3, 3)
julia> L = LinearIndices(v)
3Γ3 LinearIndices{2,Tuple{Base.OneTo{Int64},Base.OneTo{Int64}}}:
1 4 7
2 5 8
3 6 9
julia> L[C]
5-element Array{Int64,1}:
2
5
6
8
9
As wrote Kristoffer:
(LinearIndices(A))[findall(x->x == 2, A)]
You can also do
julia> C = findall(x->x>0.5, vec(v))
3-element Array{Int64,1}:
1
2
4
Is it efficient?
Could we not add mode for findall()
to iterate to through all elements in one loop?
Does Julia have more efficient way to work on the array (Like looping on its length)?
I think Kristoffer solved this problem:
Thanks to you all. Since I don,'t have findall, I tried ind2sub(A, find(A == 2))
and it worked!!
How does it compare to something like:
y = [i for i β 1:length(x) if x[i] > 0.5];
Try it and see?
[Put both in functions and use BenchmarkTools.jl
.]
It seems that βfindβ is not available anymore in Julia 1.0, correct?
If so, how do I find the index of an element in a vector?
Such as: a = [ βaβ, βbβ, βcβ, βdβ ]
find β3β for the index of element βcβ.
Thank you. (if there is any particularly efficient intrinsic function to do so, of course).
findfirst
or findall
, both of which are well-documented with examples
I tried to use findfirst, but it seems that it only works for string inputs, not vector inputs.
julia> a = [ "a", "b", "c", "d" ]
4-element Array{String,1}:
"a"
"b"
"c"
"d"
julia> findfirst("c",a)
ERROR: MethodError: no method matching findfirst(::String, ::Array{String,1})
Maybe findfirst((x -> x=="c"), a)
? (Slightly contrived, there might be a better way?)