Как выбрать элементы из массива в совпадении с предикатом 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]