2017-09-14 1 views
0

Par l'exemple suivant, je peux confirmer que multiplier ne fonctionnerait avec au plus 3 arguments:numpy.multiply peut avoir au plus 3 arguments (opérandes), est-il possible de faire plus de 3?

import numpy as np 
w = np.asarray([2, 4, 6]) 
x = np.asarray([1, 2, 3]) 
y = np.asarray([3, 1, 2]) 
z = np.asarray([10, 10, 10]) 
np.multiply(w, x, y) # works 
np.multiply(w, x, y, z) #failed 

Voici le message d'erreur:

ValueError        Traceback (most recent call last) 
<ipython-input-14-9538812eb3b4> in <module>() 
----> 1 np.multiply(w, x, y, z) 

ValueError: invalid number of arguments 

Est-il possible d'obtenir multiplier avec plus que 3 arguments? Cela ne me dérange pas d'utiliser une autre bibliothèque Python.

+4

. . . 'w * x * y * z'? –

+2

aussi 'np.multiply (w, x, y)' multiplie 'w' et' x' et place les résultats dans 'y' –

+0

@DanielF, merci d'avoir signalé la solution la plus simple, et de corriger ma compréhension! –

Répondre

1

fait multiply prend deux tableaux. C'est une opération binaire. Le troisième est un out en option. Mais comme ufunc il a une méthode reduce qui prend une liste:

In [234]: x=np.arange(4) 
In [235]: np.multiply.reduce([x,x,x,x]) 
Out[235]: array([ 0, 1, 16, 81]) 
In [236]: x*x*x*x 
Out[236]: array([ 0, 1, 16, 81]) 
In [237]: np.prod([x,x,x,x],axis=0) 
Out[237]: array([ 0, 1, 16, 81]) 

np.prod peut faire la même chose, mais attention avec le paramètre axis.

Plus amusant avec ufunc - Accumuler:

In [240]: np.multiply.accumulate([x,x,x,x]) 
Out[240]: 
array([[ 0, 1, 2, 3], 
     [ 0, 1, 4, 9], 
     [ 0, 1, 8, 27], 
     [ 0, 1, 16, 81]], dtype=int32) 
In [241]: np.cumprod([x,x,x,x],axis=0) 
Out[241]: 
array([[ 0, 1, 2, 3], 
     [ 0, 1, 4, 9], 
     [ 0, 1, 8, 27], 
     [ 0, 1, 16, 81]], dtype=int32) 
1

Vous pouvez utiliser np.prod pour calculer le produit d'éléments de réseau sur un axe donné, ici il est (axe = 0), à savoir multiplier les rangées élément sage:

np.prod([w, x, y], axis=0) 
# array([ 6, 8, 36]) 

np.prod([w, x, y, z], axis=0) 
# array([ 60, 80, 360])