2 votes

La même opération pour plusieurs paires en Python

En Python, je voudrais évaluer une fonction pour un tableau, cependant, un tableau de paires (ou plus généralement de tableaux).

Je sais que je peux faire cette opération pour un tableau de scalaires :

def f_test(scalar, pair):      
    return scalar + pair[0] + pair[1]

result = f_test(numpy.linspace(0, 9, 10), [3, 4])

Et obtenir le résultat souhaité :

[  7.   8.   9.  10.  11.  12.  13.  14.  15.  16.]

Ainsi, la paire est fixe et le scalaire est pris dans un tableau.

La question est : peut-on le faire dans l'autre sens ? Avec le scalaire maintenu fixe... Peut-on prendre les paires d'un vecteur pour obtenir à nouveau un vecteur de même longueur que le résultat ?

C'est pour (quelque chose comme, par exemple, pas nécessairement un numpy.array)

scalar = 0
pair = numpy.array([ [1,2], [3,7], [5,8] ])

obtenir

[ 3, 10, 13 ]

au lieu de

[4, 9]

Remarque : j'ai beaucoup simplifié l'opération à effectuer sur les chiffres pour garder l'exemple simple.

Si cela ne peut pas être fait ou pour être plus général : Quelle est la meilleure pratique (en Python !) pour effectuer la même opération sur un grand nombre de tableaux ?

Note : J'ai fait des recherches sur ce sujet et j'ai même trouvé des questions similaires. Cependant, je n'étais pas sûr qu'elles soient vraiment les mêmes et surtout je n'ai pas trouvé la réponse. Comme cela me semble être une opération généralement souhaitable, j'ai posé une question distincte.

2voto

pault Points 12252

Une solution consiste à transposer pair :

f_test(scalar, pair.T)
#array([ 3, 10, 13])

Ou vous pouvez utiliser la compréhension de liste :

[f_test(scalar=scalar, pair=p) for p in pair]
#[3, 10, 13]

Résultats du chronométrage

On dirait que la première méthode est beaucoup plus rapide. Pour un tableau de longueur 100.000, l'amélioration de la vitesse est ~270X sur mon ordinateur !

N = 100000
scalar = 0
pair = np.array([[np.random.randint(0,10), np.random.randint(0,10)] for i in range(N)])

# Using transpose
%%timeit
f_test(scalar, pair.T)
#1000 loops, best of 3: 229 µs per loop

# List comprehension
%%timeit
[f_test(scalar=scalar, pair=p) for p in pair]
#10 loops, best of 3: 62 ms per loop

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