2
votes

Comment puis-je multiplier plus de 3 vecteurs à la fois dans NumPy

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:)


1 commentaires

Pouvez-vous les concaténer en utilisant np.stack puis appeler np.prod le long du nouvel axe?


3 Réponses :


3
votes

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])


0 commentaires

3
votes

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])


0 commentaires

0
votes

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])


1 commentaires

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