2 votes

multiply() dans numpy python

Il me semble qu'il existe deux versions de la fonction numpy multiply() :

  1. c = multiply( a, b )
  2. multiply(a, b, c )

Ma question est double :

  1. Quelle est la différence entre les deux versions ?
  2. Je dois utiliser dot() et je sais que c = dot( a, b) œuvre. Mais dot(a, b, c) ne le fait pas.

6voto

Sven Marnach Points 133943
  1. La différence entre les deux versions de multiply() :

    c = multilpy(a, b)

    multiplie les tableaux a y b dans le sens des éléments, en créant un nouveau comme résultat. Le nom c est lié à ce nouveau tableau. Si le c a pointé sur un tableau différent auparavant, cela peut ou non déclencher le ramassage des ordures du tableau c pointée auparavant, en fonction de l'existence ou non d'autres références à ce tableau.

    multilpy(a, b, c)

    multiplie les tableaux a y b élément par élément, en stockant le résultat dans le existant réseau c (qui doit avoir des dimensions appropriées). Aucun nouvel objet de type tableau n'est créé, mais un tableau existant est modifié. Outre la différence de sémantique, cette variante est plus rapide si c pointe déjà sur un tableau de type et de dimension appropriés, car aucun nouveau tableau n'est alloué. Cette variante permet également de réduire l'utilisation de la mémoire.

  2. Ce n'est pas vraiment une question. Oui, dot() n'a pas de forme à trois paramètres. Ce n'est pas une ufunc et elle ne suit pas les règles de diffusion habituelles -- elle ne le peut pas à cause de la sémantique d'un produit point.

    Editer : Démarrage avec NumPy 1.6, dot() a en fait une forme à trois paramètres avec une sémantique similaire à celle expliquée ci-dessus. (Pour ce que ça vaut, ce n'est toujours pas une ufunc).

1voto

talonmies Points 41460

Il n'existe qu'une seule version de tous les ufuncs standard de numpy - en utilisant dot comme exemple

Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in function dot>
Namespace:      Interactive
Docstring:
    dot(a, b, out=None)

Dot product of two arrays.

For 2-D arrays it is equivalent to matrix multiplication, and for 1-D
arrays to inner product of vectors (without complex conjugation). For
N dimensions it is a sum product over the last axis of `a` and
the second-to-last of `b`::

    dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

Parameters
----------
a : array_like
    First argument.
b : array_like
    Second argument.
out : ndarray, optional
    Output argument. This must have the exact kind that would be returned
    if it was not used. In particular, it must have the right type, must be
    C-contiguous, and its dtype must be the dtype that would be returned
    for `dot(a,b)`. This is a performance feature. Therefore, if these
    conditions are not met, an exception is raised, instead of attempting
    to be flexible.

Si vous fournissez le troisième argument optionnel avec le bon dtype et l'ordre de stockage, cela fonctionnera :

In [78]: a=np.array([1.,2.,3.,4.])

In [79]: b=np.diag(a)

In [80]: c=np.empty_like(a)

In [81]: np.dot(a,b,c)
Out[81]: array([  1.,   4.,   9.,  16.])

In [82]: np.dot(a,b)
Out[82]: array([  1.,   4.,   9.,  16.])

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