2 votes

Python peut-il effectuer des opérations vectorielles ?

Je souhaite implémenter le code Matlab suivant en Python :

x=1:100;
y=20*log10(x);

J'ai essayé d'utiliser Numpy pour le faire :

y = numpy.zeros(x.shape)
for i in range(len(x)):
    y[i] = 20*math.log10(x[i])

Mais cela utilise une boucle for ; existe-t-il un moyen de faire une opération vectorielle comme dans Matlab ? Je sais que pour certains calculs simples comme la division et la multiplication, c'est possible. Mais qu'en est-il d'autres opérations plus sophistiquées comme le logarithme ici ?

3voto

Pavel Anossov Points 23610
y = numpy.log10(numpy.arange(1, 101)) * 20

In [30]: numpy.arange(1, 10)
Out[30]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

In [31]: numpy.log10(numpy.arange(1, 10))
Out[31]:
array([ 0.        ,  0.30103   ,  0.47712125,  0.60205999,  0.69897   ,
        0.77815125,  0.84509804,  0.90308999,  0.95424251])

In [32]: numpy.log10(numpy.arange(1, 10)) * 20
Out[32]:
array([  0.        ,   6.02059991,   9.54242509,  12.04119983,
        13.97940009,  15.56302501,  16.9019608 ,  18.06179974,  19.08485019])

3voto

Sajjan Singh Points 2419

Oui, c'est vrai.

x = numpy.arange(1, 100)
y = 20 * numpy.log10(x)

2voto

Pyrce Points 2405

Numpy dispose d'un grand nombre d'opérateurs de tableau intégrés tels que log10 . S'il n'est pas listé dans la documentation de numpy et que vous ne pouvez pas le générer en combinant les méthodes intégrées, alors il n'y a pas de moyen facile de le faire efficacement. Vous pouvez implémenter une fonction en C pour travailler sur les tableaux numpy et la compiler, mais cela représente beaucoup plus de travail qu'une ou deux lignes de code Python.

Dans votre cas, vous avez déjà presque la bonne sortie :

y = 20*numpy.log10(x)

2voto

JoshAdel Points 15911

Vous pouvez jeter un coup d'œil à la documentation de Numpy. C'est un bon point de départ :

http://docs.scipy.org/doc/numpy/reference/routines.html

Et spécifiquement lié à votre question :

http://docs.scipy.org/doc/numpy/reference/routines.math.html

1voto

mcmaster Points 19

Si vous n'essayez pas de faire quelque chose de compliqué, le code original pourrait être implémenté de cette façon également, sans nécessiter l'utilisation de numpy, si je ne me trompe pas.

>>> import math
>>> x = range(1, 101)
>>> y = [ 20 * math.log10(z) for z in x ]

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