2010-10-20 28 views
2

D'abord, laissez-moi vous montrer la codez:fonction de mappage de tableau numpy, variation d'un paramètre

a = array([...]) 
for n in range(10000): 
    func_curry = functools.partial(func, y=n) 
    result = array(map(func_curry, a)) 
    do_something_else(result) 
    ... 

Ce que je fais ici tente d'appliquer func à un tableau, en changeant à chaque fois que la valeur du func deuxième paramètre. C'est SLOOOOW (créer une nouvelle fonction à chaque itération n'aide certainement pas), et j'ai aussi l'impression d'avoir manqué la façon pythonique de le faire. Toute suggestion?

Est-ce qu'une solution qui me donne un tableau 2D pourrait être une bonne idée? Je ne sais pas, mais peut-être que c'est le cas.

Réponses aux questions possibles:

  • Oui, cela est (en utilisant une définition large), un problème d'optimisation (do_something_else() cache ce)
  • Non, scipy.optimize n'a pas fonctionné parce que je suis traiter des valeurs booléennes et il ne semble jamais converger.
+0

Que fait func? Si nous en savons plus sur ce qu'il fait, nous pouvons peut-être vous aider à trouver un moyen plus rapide de le faire. En ce moment, je pense que cette carte doit changer numpy array en une liste, la mapper, puis la liste est en train d'être changée en un tableau qui ne me semble pas rapide. Si nous pouvons trouver un moyen de faire func aux colonnes en utilisant des fonctions numpy, cela devrait être plus rapide. Je devine que vous appllez func sur chaque colonne de la matrice dans un, puis en utilisant le résultat pour se rapprocher de la bonne solution. Avez-vous profilé pour vous assurer que cette partie est le problème et non la partie do_something_else? –

Répondre

6

Avez-vous essayé numpy.vectorize?

... 
    vfunc_curry = vectorize(functools.partial(func, y=n)) 
    result = vfunc_curry(a) 
... 
0

Si a est de taille significative, le goulot d'étranglement ne devrait pas être la création de la fonction, mais la duplication du tableau.

+0

'a' est un tableau 1D numpy de longueur 100 – Agos

+0

alors que das' func' faire? Si vous ne pouvez pas révéler ce que 'func' fait pour une raison quelconque, vous devez rechercher le goulot d'étranglement pour vous-même. Un profileur aidera avec cela (http://docs.python.org/library/profile.html). – tback

0

Pouvez-vous réécrire la fonction? Si possible, vous devez écrire la fonction pour prendre deux tableaux numpy a et numpy.arange(n). Vous devrez peut-être modifier la forme pour aligner les baies pour la diffusion.