Tableaux Julia
Un tableau est une collection d'éléments du même type de données disposés dans un certain ordre ; il peut s'agir d'un tableau unidimensionnel ou d'un tableau multidimensionnel.
Julia prend en charge les structures de données de type tableau, qui peuvent stocker une collection ordonnée dont la taille n'est pas fixe et dont les éléments peuvent être du même type ou de types différents.
Les tableaux Julia sont des collections typées mutables utilisées pour les listes, les vecteurs, les tables et les matrices.
Les clés d'index des tableaux Julia peuvent être représentées par des entiers, et la taille d'un tableau n'est pas fixe.
Julia fournit de nombreuses fonctions pour nous aider à manipuler les tableaux, comme ajouter des éléments aux tableaux, fusionner des tableaux, etc.
Les tableaux Julia utilisent des crochets[...]pour les spécifier, et plusieurs éléments utilisent des virgules,pour les séparer.
La syntaxe de création d'un tableau unidimensionnel (c'est-à-dire un vecteur) est :
[A, B, C, ...]
Création de tableaux unidimensionnels
L'exemple suivant crée un tableau unidimensionnel simple :
Exemple
3-element Vector{Int64}:
1
2
3
Dans l’exemple ci-dessus, nous avons créé un tableau à une dimension contenant 3 éléments, chaque élément est un entier 64 bits, et ce tableau à une dimension est lié à la variablearr.
Les types des éléments d’un tableau peuvent aussi être différents :
Exemple
4-element Vector{Any}:
1
"EXAMPLE"
2.5
π = 3.1415926535897...
Dans l’exemple ci-dessus, nous avons créé un tableau à une dimension contenant 4 éléments de types différents.piest une constanteπ, chaque élément est un entier 64 bits, et ce tableau à une dimension est lié à la variablearr.
Bien sûr, vous pouvez aussi forcer le type :
Exemple
3-element Vector{Int64}:
1
2
3
julia> arr2 = String["Taobao","EXAMPLE","GOOGLE"]
3-element Vector{String}:
"Taobao"
"EXAMPLE"
"GOOGLE"
Le tableau dans l'exemple ci-dessusarrest limité aux entiers,arr2est limité aux chaînes de caractères.
Nous pouvons également créer un tableau vide :
Exemple
Int64[]
julia> arr2 = String[]
String[]
Le tableau créé est directement accessible à l'aide de valeurs d'indice. La première valeur a l'indice 1 (pas 0), la deuxième a l'indice 2, et ainsi de suite. La dernière peut utiliserendpour la représenter :
Exemple
3-element Vector{Int64}:
1
2
3
julia> arr[2]
2
julia> arr2 = String["Taobao","EXAMPLE","GOOGLE"]
3-element Vector{String}:
"Taobao"
"EXAMPLE"
"GOOGLE"
julia> arr2[1]
"Taobao"
julia> arr2[end]
"GOOGLE"
Spécification des types et dimensions de tableau
Nous pouvons également utiliser la syntaxe suivante pour spécifier le type et les dimensions d'un tableau :
Array{type}(undef, dims...)
undefindique que le tableau n'est pas initialisé.
dims...peut être un tuple de dimensions unique ou multiple, ou un ensemble de valeurs lorsque les dimensions sont passées comme arguments variables.
dims...Le nombre représente le nombre d'éléments ; plusieurs dimensions utilisent des virgules,pour les séparer.
Exemple
3-element Vector{Int64}:
4834342704
4377305096
0
julia> array = Array{Int64}(undef, 3, 3, 3) # représente un tableau à 3 dimensions, avec 3 éléments dans chaque dimension
3×3×3 Array{Int64, 3}:
[:, :, 1] =
4562265712 0 0
1 0 0
0 0 0
[:, :, 2] =
0 0 0
0 0 0
0 0 0
[:, :, 3] =
0 0 0
0 0 0
0 0 0
Dans l'exemple ci-dessus, nous plaçons le type du tableau entre accolades{}, undef est utilisé pour définir le tableau comme non initialisé à une valeur connue ; c'est pourquoi nous obtenons des nombres aléatoires dans la sortie.
Création de tableaux et de matrices à deux dimensions
Nous pouvons omettre les virgules entre les éléments du tableau,ou utiliser deux signes deux-points;;, de cette façon nous pouvons créer un tableau à deux dimensions, comme dans l'exemple suivant :
Exemple
1×4 Matrix{Int64}:
1 2 3 4
julia> [1;; 2;; 3;; 4]
1×4 Matrix{Int64}:
1 2 3 4
Remarque :La sortie de la première ligne1×4 Matrix{Int64}:, 1x4 représente une matrice avec une ligne et quatre colonnes.
Bien qu'il n'ait qu'une seule ligne, il s'agit toujours d'un tableau à deux dimensions, car Julia ne reconnaît que les vecteurs colonnes, et non ce qu'on appelle des vecteurs lignes.
Pour ajouter une autre ligne, ajoutez simplement un point-virgule;, voir l'exemple suivant :
Exemple
2×2 Matrix{Int64}:
1 2
3 4
Vous pouvez également utiliser des deux-points:et des espaces pour y parvenir, voir l'exemple suivant :
Exemple
2×2 Matrix{Int64}:
1 3
2 4
Remarque :La sortie dans la première ligne2×2 Matrix{Int64}:, 2×2 représente une matrice avec deux lignes et deux colonnes.
Nous pouvons également intégrer des tableaux à une dimension de même longueur entre crochets[]et les séparer par des espaces pour créer un tableau à deux dimensions :
Exemple
2×3 Matrix{Int64}:
1 3 5
2 4 6
2x3représente un tableau à deux lignes et trois colonnes.
Ci-dessous, nous utilisons de manière flexible des points-virgules;et des espaces pour créer un tableau à deux dimensions avec deux lignes et trois colonnes, et un avec trois lignes et deux colonnes :
Exemple
2×3 Matrix{Int64}:
1 3 5
2 4 6
julia> [[1 2]; [3 4]; [5 6]]
3×2 Matrix{Int64}:
1 2
3 4
5 6
Utilisation des fonctions de plage pour créer des tableaux
Points de suspension ...
Vous pouvez utiliser les points de suspension...pour créer un tableau, comme dans l'exemple suivant :
Exemple
11-element Vector{Int64}:
0
1
2
3
4
5
6
7
8
9
10
Fonction collect()
La syntaxe de la fonction collect() est la suivante :
collect(start:step:stop)
start est la valeur de départ, step est le pas, et stop est la valeur finale.
Cette fonction retourne un tableau.
Dans l'exemple suivant, la valeur est 1, le pas est 2, et la valeur de fin est 13 :
Exemple
7-element Vector{Int64}:
1
3
5
7
9
11
13
La fonction collect() peut également spécifier un type, avec la syntaxe suivante :
collect(element_type, start:step:stop)
L'exemple suivant crée un tableau de nombres à virgule flottante :
Exemple
3-élément Vector{Float64}:
1.0
3.0
5.0
Fonction range()
La fonction range() peut générer un intervalle et spécifier un pas, ce qui est pratique pour que la fonction collect() puisse l'appeler.
La syntaxe de la fonction range() est la suivante :
range(start, stop, length) range(start, stop; length, step) range(start; length, stop, step) range(;start, length, stop, step)start est la valeur de départ, step est le pas, stop est la valeur de fin, et length est la longueur.
Exemple
1:100
julia> range(1, stop=100)
1:100
julia> range(1, step=5, length=100)
1:5:496
julia> range(1, step=5, stop=100)
1:5:96
julia> range(1, 10, length=101)
1.0:0.09:10.0
julia> range(1, 100, step=5)
1:5:96
julia> range(stop=10, length=5)
6:10
julia> range(stop=10, step=1, length=5)
6:1:10
julia> range(start=1, step=1, stop=10)
1:1:10
Si length n'est pas spécifié, etstop - startn'est pas un multiple entier de step, alors une plage qui se termine avant stop sera générée.
julia> range(1, 3.5, step=2) 1.0:2.0:3.0
Création de tableaux avec range() et collect() :
Exemple
10-element Vector{Int64}:
1
2
3
4
5
6
7
8
9
10
julia> collect(range(1, length=15, stop=150))
15-élément Vector{Float64}:
1.0
11.642857142857142
22.285714285714285
32.92857142857143
43.57142857142857
54.214285714285715
64.85714285714286
75.5
86.14285714285714
96.78571428571429
107.42857142857143
118.07142857142857
128.71428571428572
139.35714285714286
150.0
Création de tableaux avec les compréhensions et les générateurs
Une autre façon utile de créer des tableaux consiste à utiliser des compréhensions.
La syntaxe des compréhensions de tableaux est la suivante :
A = [ F(x,y,...) for x=rx, y=ry, ... ]
F(x,y,...) est évalué pour chaque valeur des variables x, y, etc. dans les listes données. Les valeurs peuvent être spécifiées sous forme de tout objet itérable, mais il s'agit généralement de plages comme 1:n ou 2:(n-1), ou de valeurs de tableau explicites comme [1.2, 3.4, 5.7]. Le résultat est un tableau dense à N dimensions dont les dimensions sont obtenues en concaténant les dimensions des plages de variables rx, ry, etc., et chaque évaluation de F(x,y,...) renvoie un scalaire.
Exemple
10-element Vector{Int64}:
1
4
9
16
25
36
49
64
81
100
Création d'un tableau à deux dimensions :
Exemple
10×10 Matrix{Int64}:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Les compréhensions peuvent également être écrites sans crochets, produisant un objet appelé générateur.
L'exemple suivant crée un tableau :
Exemple
5-element Vector{Int64}:
1
4
9
16
25
L'expression suivante calcule la somme d'une séquence sans allouer de mémoire :
Exemple
1.6439345666815615
Fonctions de base des tableaux Julia
| Fonction | Description |
|---|---|
eltype(A) |
Ale type des éléments dans |
length(A) |
Ale nombre d'éléments dans |
ndims(A) |
Ala dimension de |
size(A) |
un tuple contenantAun tuple avec le nombre d'éléments dans chaque dimension |
size(A,n) |
ANon.nle nombre d'éléments dans la dimension |
axes(A) |
un tuple contenantAun tuple d'indices valides |
axes(A,n) |
Non.nla plage d'indices valides pour la dimension |
eachindex(A) |
un itérateur efficace pour accéder àAchaque position dans |
stride(A,k) |
sur lekpas sur la dimension (distance en indice linéaire entre éléments adjacents) |
strides(A) |
un tuple contenant le pas sur chaque dimension |
Construction et initialisation en Julia
Julia fournit de nombreuses fonctions pour construire et initialiser des tableaux. Dans les fonctions suivantes, l'argument dims ... peut être un tuple pour représenter les dimensions, ou un nombre variable de valeurs entières comme dimensions. Le premier argument de la plupart des fonctions représente le type d'élément T du tableau. Si le type T est omis, il vaut par défaut Float64.
| Fonction | Description |
|---|---|
Array{T}(undef, dims...) |
Un tableau dense non initialiséArray |
zeros(T, dims...) |
Un tableau de zérosArray |
ones(T, dims...) |
Un tableau dont tous les éléments sont égaux à 1Array |
trues(dims...) |
Un tableau dont chaque élément esttruedeBitArray |
falses(dims...) |
Un tableau dont chaque élément estfalsedeBitArray |
reshape(A, dims...) |
Un tableau contenant les mêmesAtableau avec les mêmes données mais des dimensions différentes |
copy(A) |
copyA |
deepcopy(A) |
copie profonde, c'est-à-dire copierA, et en copiant récursivement ses éléments |
similar(A, T, dims...) |
Un tableau avec les mêmesAun tableau non initialisé ayant le même type (il s'agit ici de dense, sparse, etc.) mais avec le type d'élément et les dimensions spécifiés. Les deuxième et troisième paramètres sont tous deux facultatifs ; s'ils sont omis, ils prennent par défaut le type d'élément etAles dimensions de. |
reinterpret(T, A) |
etAUn tableau ayant les mêmes données binaires, mais le type d'élément estT |
rand(T, dims...) |
Un tableau aléatoireArray, les valeurs des éléments sontdistribuées uniformément dans l'intervalle semi-ouvert et suivant une loi indépendante et identique du premier ordre[1] |
randn(T, dims...) |
Un tableau aléatoireArray, les éléments suivent une loi normale standard, indépendants et identiquement distribués |
Matrix{T}(I, m, n) |
mlinenmatrice identité avec des colonnes (il faut d'abord exécuterusing LinearAlgebraafin d'utiliserI) |
range(start, stop=stop, length=n) |
fromstartàstopwithnplage d'éléments espacés linéairement |
fill!(A, x) |
Avec la valeurxremplir le tableauA |
fill(x, dims...) |
Un tableau rempli dexrempliArray |
zeros()Créer une instance de tableau, les valeurs initiales des éléments sont toutes à 0 :
Exemple
2×3 Matrix{Int8}:
0 0 0
0 0 0
julia> zeros(Int8, (2, 3))
2×3 Matrix{Int8}:
0 0 0
0 0 0
julia> zeros((2, 3))
2×3 Matrix{Float64}:
0.0 0.0 0.0
0.0 0.0 0.0