web-dev-qa-db-fra.com

Comment sélectionner les éléments du tableau dans le prédicat correspondant Julia?

Julia semble avoir beaucoup de fonctionnalités similaires à Matlab. Je voudrais sélectionner dans un tableau en utilisant un prédicat. Dans Matlab, je peux faire ceci comme:

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

ans =

     0     0     0     1     1     1

>> a(a>4)

ans =

     5     6     7

J'ai trouvé une sorte de façon maladroite de faire une partie de cela en Julia:

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

(En utilisant ce que wikipedia appelle compréhension de la liste ). Je n'ai pas compris comment appliquer un ensemble comme celui-ci pour sélectionner avec dans Julia, mais il se peut que j'aboie le mauvais arbre. Comment ferait-on une sélection de prédicat à partir d'un tableau dans Julia?

20
Peeter Joot

Vous pouvez utiliser une syntaxe très semblable à Matlab si vous utilisez un point . pour élément par élément comparaison:

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

Alternativement, vous pouvez appeler filter si vous voulez une approche de prédicat plus fonctionnelle:

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

La compréhension des tableaux dans Julia est un peu plus primitive que la compréhension des listes dans Haskell ou Python. Il existe deux solutions: vous pouvez utiliser une fonction de filtrage d'ordre supérieur ou utiliser des opérations de diffusion.

Filtrage d'ordre supérieur

filter(x -> x > 4, a)

Cela appelle la fonction filter avec le prédicat x -> x > 4 (voir Fonctions anonymes dans le manuel de Julia).

Radiodiffusion et indexation

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

Ceci effectue une comparaison de diffusion entre les éléments de a et 4, puis utilise le tableau de booléens résultant pour indexer a. Il peut être écrit de manière plus compacte en utilisant un opérateur de radiodiffusion:

a[a .> 4]
12
jch

Pour filtrer les clés dans un dictionnaire, cela a fonctionné pour moi:

mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
filter(x -> occursin("part of a string", string(x)), keys(mydict))

Voici à quoi ressemble la sortie sur le REPL dans Julia 1.0

Julia> mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
Dict{String,Float64} with 3 entries:
  "key2"                                 => 2.0
  "key1"                                 => 1.0
  "a big string with a part of a string" => 3.0

Julia> filter(x -> occursin("part of a string", string(x)), keys(mydict))
Set(["a big string with a part of a string"])

C'est en général un excellent moyen de filtrer un tableau de chaînes.

J'espère que cela pourra aider.

0
phyatt