Je recherche un moyen vectorisé de multiplier plus de 3 vecteurs dans NumPy.
A titre d'exemple,
np.array([28, 80, 162])
produirait en sortie p >
X = np.array([1,2,3]) Y = np.array([4,5,6]) Z = np.array([7,8,9]) Multiply([X,Y,Z])
Les vecteurs que je veux multiplier n'ont pas besoin d'être définis séparément comme je l'ai fait ci-dessus. Cela pourrait être, par exemple, les lignes (ou colonnes) d'une matrice, et dans ce cas, je voudrais multiplier toutes les lignes (ou colonnes) d'une telle matrice.
Aide à apprécier:)
3 Réponses :
Vous pouvez utiliser la méthode reduction
de l'ufunc:
>>> np.multiply.reduce((X, Y, Z), axis=1) array([ 6, 120, 504])
Ce qui se passe ici, c'est que l'ufunc np.multiply
, qui ressemble et agit comme une fonction, est techniquement une instance de la classe numpy.ufunc
; tous les ufuncs ont quatre méthodes spéciales , l'une d'elles étant .reduce () , qui fait ce que vous recherchez dans ce cas et produit un résultat 1d à partir de plusieurs tableaux 1d de même longueur.
L'axe par défaut est 0; si vous souhaitez travailler le long de l'autre axe, spécifiez simplement que:
>>> np.multiply.reduce((X, Y, Z)) array([ 28, 80, 162])
Vous pouvez utiliser numpy.prod
, qui utilise multiply.reduce
sous le capot.
>>> np.prod([X, Y, Z], 0) array([ 28, 80, 162]) >>> np.prod([X, Y, Z], 1) array([ 6, 120, 504])
Ou tout simplement utiliser la notation habituelle *
:
In [181]: X * Y * Z * X * Y * Z Out[181]: array([ 784, 6400, 26244])
En général, vous pouvez utiliser autant de tableaux que vous le souhaitez:
In [180]: X * Y * Z Out[180]: array([ 28, 80, 162])
Je supposais en quelque sorte que la question concernait un argument variadique, c'est-à-dire multiply_arrays (* arrays)
, ou multiply_arrays (arrays)
(sequence arg). Sinon, ce serait certainement plus simple
Pouvez-vous les concaténer en utilisant
np.stack
puis appelernp.prod
le long du nouvel axe?