2 votes

Comment créer un tableau "ones" dans Julia ?

Dans de nombreux cas d'utilisation de l'apprentissage automatique, vous devez créer un tableau rempli d'unités, avec des dimensions spécifiques. En Python, j'utiliserais np.ones((2, 1)) . Quelle est la version analogique de ceci dans Julia ?

4voto

logankilpatrick Points 1103

Julia a une fonction intégrée de ones qui peut être utilisée comme suit :

  julia> ones(1,2)
  1×2 Matrix{Float64}:
   1.0  1.0

Vous pouvez en savoir plus sur le ones dans le Docs Julia .

0voto

Ted Dunning Points 1043

La réponse de Logan est excellente. Vous pouvez simplement utiliser la fonction "ones".

MAIS, vous pouvez aussi souvent ne pas l'utiliser.

Par exemple, une utilisation courante d'un vecteur de uns est de multiplier ce vecteur par un autre vecteur afin d'obtenir une matrice où chaque ligne a la même valeur que l'élément correspondant de la matrice. Vous pouvez ensuite ajouter cette matrice à quelque chose. Cela vous permet d'ajouter les valeurs d'un vecteur aux lignes correspondantes d'une matrice. Vous obtenez un code comme celui-ci :

>>> A = np.random.rand(4,3)
>>> x = np.random.rand(4)
array([0.01250529, 0.9620139 , 0.70991563, 0.99795451])
>>> A + np.reshape(np.ones(3), (1,3)) * np.reshape(x, (4,1)) 
array([[0.09141967, 0.83982525, 0.16960596],
       [1.39104681, 1.10755182, 1.60876696],
       [1.14249757, 1.68167344, 1.64738165],
       [1.10653393, 1.45162139, 1.23878815]])

Il s'agit en fait d'un travail supplémentaire pour l'ordinateur, car Python ne peut pas l'optimiser et il y a beaucoup de travail supplémentaire à faire. Vous pouvez également utiliser ce que l'on appelle la diffusion pour réaliser cette extension plus simplement, mais vous devez toujours donner à x la bonne forme :

>>> A + x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (4,3) (4,) 
>>> A + np.reshape(x, (4,1))
array([[0.09141967, 0.83982525, 0.16960596],
       [1.39104681, 1.10755182, 1.60876696],
       [1.14249757, 1.68167344, 1.64738165],
       [1.10653393, 1.45162139, 1.23878815]])

Dans Julia, l'extension du vecteur à la même forme que la matrice à laquelle on veut ajouter peut être faite plus simplement en utilisant l'opérateur de diffusion. Ainsi, le code ci-dessus se simplifie en

julia> A = rand(4,3)
4×3 Matrix{Float64}:
 0.885593  0.494999  0.534039
 0.915725  0.479218  0.229797
 0.739122  0.670486  0.247376
 0.419879  0.857314  0.652547

julia> x = rand(4)
4-element Vector{Float64}:
 0.9574839624590326
 0.9736140903654276
 0.6051487944513263
 0.3581090323172089

julia> A .+ x
4×3 Matrix{Float64}:
 1.84308   1.45248  1.49152
 1.88934   1.45283  1.20341
 1.34427   1.27563  0.852524
 0.777988  1.21542  1.01066

Une raison pour laquelle cela fonctionne mieux est qu'il y a moins de bruit dans la syntaxe parce que les tableaux sont primitifs pour Julia.

Plus important encore, cependant, le compilateur voit l'utilisation de l'opérateur de diffusion et il peut générer un code très efficace (et peut même le vectoriser). En fait, x n'a même pas besoin d'être un vecteur réel tant qu'il a quelques-unes des mêmes méthodes définies pour lui.

En fait, si vous avez vraiment besoin d'un vecteur ou d'une matrice de tous les uns (ou d'une autre constante), vous pouvez également utiliser la diffusion avec des scalaires.

julia> A .+ 1
4×3 Matrix{Float64}:
 1.88559  1.495    1.53404
 1.91572  1.47922  1.2298
 1.73912  1.67049  1.24738
 1.41988  1.85731  1.65255

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X