Найти элемент в массиве определенного типа в Юлии - PullRequest
0 голосов
/ 15 апреля 2019

Я хотел бы использовать функцию (я уверен, что она есть) в Julia, которая принимает массив (или аналогичный тип) и тип (например, ничего) в качестве входных данных, проверяет каждый элемент в массиве, чтобы увидеть,element имеет этот тип и возвращает индексы элементов в массиве этого типа.Например:

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

Похоже на MATLAB в принципе.Я нашел несколько предложений по использованию find, но, похоже, он устарел - Джулия жалуется, когда я пытаюсь его использовать.Я полагаю, что в Джулии должна быть такая функция, хотя я, конечно, мог бы написать довольно быстрый код для выполнения вышесказанного.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Использование 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
0 голосов
/ 15 апреля 2019

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
...