web-dev-qa-db-fra.com

Initialiser un tableau de tableaux dans Julia

J'essaie de créer un tableau de deux tableaux. Cependant, a = [[1, 2], [3, 4]] Ne fait pas cela, il concatène en fait les tableaux. C'est vrai dans Julia: [[1, 2], [3, 4]] == [1, 2, 3, 4]. Une idée?

Comme solution de contournement temporaire, j'utilise Push!(Push!(Array{Int, 1}[], a), b).

30
fhucho

Si vous voulez un tableau de tableaux par opposition à une matrice (c'est-à-dire _ à deux dimensions Array):

a = Array[ [1,2], [3,4] ]

Vous pouvez paramétrer (spécifier le type des éléments) un littéral Array en plaçant le type devant le []. Nous paramétrons donc ici le littéral Array avec le type Array. Cela modifie l'interprétation des crochets à l'intérieur de la déclaration littérale.

22
Sean Mackesey

La réponse de Sean Mackesey vous donnera quelque chose de type Array{Array{T,N},1} (ou Array{Array{Int64,N},1}, si vous mettez le type devant []). Si vous voulez plutôt quelque chose de plus fortement typé, par exemple un vecteur de vecteurs d'Int (c'est-à-dire Array{Array{Int64,1},1}), utilisez le suivant:

a = Vector{Int}[ [1,2], [3,4] ]
15
Jim Garrison

Dans Julia v0.5, la syntaxe d'origine produit désormais le résultat souhaité:

Julia> a = [[1, 2], [3, 4]]
2-element Array{Array{Int64,1},1}:
 [1,2]
 [3,4]

Julia> VERSION
v"0.5.0"
13
David P. Sanders

Pour une réponse générale sur la construction de tableaux de type Array:

Dans Julia, vous pouvez avoir un tableau qui contient d'autres objets de type tableau. Considérez les exemples suivants d'initialisation de différents types de tableaux:

A = Array{Float64}(10,10)  # A single Array, dimensions 10 by 10, of Float64 type objects

B = Array{Array}(10,10,10)  # A 10 by 10 by 10 Array.  Each element is an Array of unspecified type and dimension.

C = Array{Array{Float64}}(10)  ## A length 10, one-dimensional Array.  Each element is an Array of Float64 type objects but unspecified dimensions

D = Array{Array{Float64, 2}}(10)  ## A length 10, one-dimensional Array.  Each element of is an 2 dimensional array of Float 64 objects

Considérez par exemple les différences entre C et D ici:

Julia> C[1] = Rand(3)
3-element Array{Float64,1}:
 0.604771
 0.985604
 0.166444

Julia> D[1] = Rand(3)
ERROR: MethodError: 

Rand(3) produit un objet de type Array{Float64,1}. Étant donné que la seule spécification pour les éléments de C est qu'ils doivent être des tableaux avec des éléments de type Float64, cela correspond à la définition de C. Mais, pour D, nous avons spécifié que les éléments doivent être des tableaux bidimensionnels. Ainsi, puisque Rand(3) ne produit pas de tableau à 2 dimensions, nous ne pouvons pas l'utiliser pour affecter une valeur à un élément spécifique de D

Spécifiez les dimensions spécifiques des tableaux dans un tablea

Bien que nous puissions spécifier qu'un tableau contiendra des éléments qui sont de type tableau, et nous pouvons spécifier que, par exemple ces éléments doivent être des tableaux bidimensionnels, nous ne pouvons pas spécifier directement les dimensions de ces éléments. Par exemple. nous ne pouvons pas spécifier directement que nous voulons un tableau contenant 10 tableaux, chacun étant 5,5. Nous pouvons le voir dans la syntaxe de la fonction Array() utilisée pour construire un tableau:

Tableau {T} (dims)

construit un tableau dense non initialisé avec le type d'élément T. dims peut être un Tuple ou une série d'arguments entiers. La syntaxe Array (T, dims) est également disponible, mais déconseillée.

Le type d'un tableau dans Julia comprend le nombre de dimensions mais pas la taille de ces dimensions. Ainsi, il n'y a pas de place dans cette syntaxe pour spécifier les dimensions précises. Néanmoins, un effet similaire pourrait être obtenu en utilisant une compréhension de tableau:

E = [Array{Float64}(5,5) for idx in 1:10]
8
Michael Ohlrogge

Vous voulez probablement une matrice:

Julia> a = [1 2; 3 4]
2x2 Int64 Array:
 1  2
 3  4

Peut-être un tuple:

Julia> a = ([1,2],[3,4,5])
([1,2],[3,4,5])
2
juliohm

Vous pouvez également faire {[1,2], [3,4]} qui crée un Array{Any,1} contenant [1,2] et [3,4] au lieu d'un Array{Array{T,N},1}.

2
PythonNut

Pour ceux qui se demandent, dans la version 0.7, c'est assez similaire:

Array{Array{Float64,1},2}(undef, 10,10)  #creates a two-dimensional array, ten rows and ten columns where each element is an array of type Float64

Array{Array{Float64, 2},1}(undef,10) #creates a one-dimensional array of length ten, where each element is a two-dimensional array of type Float64
1
Lotte Victor