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 ?
Réponses
Trop de publicités?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 .
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