Как выбрать элементы из массива в совпадении с предикатом Julia?

У Джулии, похоже, много функций, похожих на Matlab. Я хотел бы выбрать из массива, используя предикат. В Matlab я могу сделать это, например:

>> a = 2:7 ;
>> a > 4

ans =

     0     0     0     1     1     1

>> a(a>4)

ans =

     5     6     7

Я нашел своего рода неуклюжий, кажущийся способ сделать часть этого в Джулии:

julia> a = 2:7
2:7

julia> [int(x > 3) for x in a]
6-element Array{Any,1}:
 0
 0
 1
 1
 1
 1

(Используя то, что wikipedia вызывает понимание списка). Я не понял, как применить набор, подобный этому, для выбора с помощью Julia, но может быть лаять неправильное дерево. Как сделать выбор предиката из массива в Джулии?

Ответ 1

Вы можете использовать синтаксис, похожий на Matlab, если использовать . для elementwise сравнение:

julia> a = 2:7
2:7

julia> a .> 4
6-element BitArray{1}:
 false
 false
 false
  true
  true
  true

julia> a[a .> 4]
3-element Array{Int32,1}:
 5
 6
 7

В качестве альтернативы вы можете вызвать filter, если вы хотите использовать более функциональный предикат:

julia> filter(x -> x > 4, a)
3-element Array{Int32,1}:
 5
 6
 7

Ответ 2

Массивное понимание в Джулии несколько более примитивно, чем понимание списков в Haskell или Python. Существует два решения: вы можете использовать функцию фильтрации более высокого порядка или использовать широковещательные операции.

Фильтрация более высокого порядка

filter(x -> x > 4, a)

Это вызывает функцию filter с предикатом x -> x > 4 (см. Анонимные функции в руководстве Julia).

Вещание и индексирование

a[Bool[a[i] > 4 for i = 1:length(a)]]

Выполняет сопоставление вещания между элементами a и 4, затем использует результирующий массив булевых индексов для индекса a. Его можно записать более компактно с помощью оператора вещания:

a[a .> 4]