2010-08-09 7 views
2

Comment écrire la boucle suivante en utilisant la boucle implicite de Python?Diffusion d'un tableau avec numpy

def kl(myA, myB, a, b): 
    lots of stuff that assumes all inputs are scalars 

x, y = meshgrid(inclusive_arange(0.0, xsize, 0.10),\ 
       inclusive_arange(0.0, ysize, 0.10)) 

for j in range(x.shape[0]): 
    for i in range(x.shape[1]): 
     z[j, i] = kl(x[j, i], y[j, i]) 

Je veux faire quelque chose comme

z = kl(x, y) 

mais qui donne:

TypeError: only length-1 arrays can be converted to Python scalars 
+3

"boucle implicite"? pouvez-vous définir cela? – nosklo

+0

Je suppose que je voulais dire "diffusion de tableau" :) –

Répondre

5

La capacité que vous vous posez au sujet existe que dans Numpy, et il est appelé array broadcasting, non implicite en boucle. Une fonction qui diffuse une opération scalaire sur un tableau s'appelle une fonction universelle, ou ufunc. De nombreuses fonctions de base de Numpy sont de ce type.

Vous pouvez utiliser numpy.frompyfunc pour convertir votre fonction existante kl en un ufunc.

kl_ufunc = numpy.frompyfunc(kl, 4, 1) 
... 
z = kl_ufunc(x + 1.0, y + 1.0, myA, myB) 

Bien sûr, si vous voulez, vous pourriez appeler le ufunc kl au lieu de kl_ufunc, mais la définition originale de kl serait perdu. Cela pourrait convenir à vos objectifs.

+0

Merci! Cela a fonctionné. –