10
votes

Réécrire une double boucle d'une manière plus agréable et peut-être plus courte

Je me demande si le code suivant peut être écrit de manière un peu plus agréable. Fondamentalement, je veux calculer z = f (x, y) pour un (x, y) meshgrid. xxx


0 commentaires

7 Réponses :


7
votes

Vous pouvez faire quelque chose comme xxx


0 commentaires

2
votes

Si vous le définissez à la fois, vous pouvez utiliser une compréhension de la liste; xxx

si vous devez utiliser un z qui est déjà là, cependant, vous Je ne peux pas faire ça et votre code concerne le soirée que vous obtiendrez.

Addition: Je ne sais pas avec ce que lingrid fait , mais s'il produit une liste de 100 éléments, utilisez la compréhension de la liste d'Aaronasterling; Aucun point dans la création d'un itérateur supplémentaire si vous n'avez pas besoin de.


0 commentaires

26
votes

Ouais. Votre code tel que présenté dans la question est bien.

Ne pensez jamais que peu de lignes sont "belles" ou "cool". Ce qui compte la clarté, la lisibilité et la maintenabilité. D'autres personnes devraient pouvoir comprendre votre code (et vous devez le comprendre dans 12 mois, lorsque vous devez trouver un bogue).

De nombreux programmeurs, en particulier les plus jeunes, pensent que les solutions "intelligentes" sont souhaitables. Ils ne sont pas. Et c'est ce qui est si gentil avec la communauté python. Nous sommes beaucoup moins affligés par cette erreur que d'autres.


2 commentaires

J'ai suscité ceci parce que c'est une leçon que j'apprendais moi-même, mais si elles ne sont que des listes, je pense que ma solution est plus agréable que le code de l'OP, car il évite les itérateurs superflus. Avec les mêmes hypothèses, la réponse de la Wheatie est meilleure encore.


Les itérateurs sont toujours là. Ça ne fait rien. Cela dit que j'utilise des compréhensions de la liste tout le temps, bien sûr, mais si je dois les nichier, je les étends à la place, ils deviennent donc plus faciles à lire.



4
votes

Vous pouvez utiliser iTertools 'Produit:

def ranged_linspace( _start, _end, _function ):
    def output_z( xr, yr ):
        return [_function( i, j ) for i,j in product( linspace( _start, xr, _end ), linspace( _start, yr, _end ) )]
    return output_z


1 commentaires

Il convient de noter que toutes ces solutions produisent une liste unidimensionnelle au lieu d'une liste imbriquée comme la solution de OP.



0
votes

Cela montre le résultat général. A CODE> est conçu dans une liste 6 long et B code> est de 4 longs. Le résultat est une liste de 6 listes et chaque liste imbriquée est de 4 éléments longs.

>>> def f(x,y):
...     return x+y
... 
>>> a, b = list(range(0, 12, 2)), list(range(0, 12, 3))
>>> print len(a), len(b)
6 4
>>> result = [[f(aa, bb) for bb in b] for aa in a]
>>> print result
[[0, 3, 6, 9], [2, 5, 8, 11], [4, 7, 10, 13], [6, 9, 12, 15], [8, 11, 14, 17], [10, 13, 16, 19]]


0 commentaires

0
votes

Je pense que c'est le code unique que vous recherchez

z =  [[a+b for b in linspace(0,yr,100)] for a in linspace(0,xr,100)]


0 commentaires

0
votes

Votre linspace on dirait que cela pourrait être np.linspace . Si vous pouvez utiliser des tableaux numpus sans avoir à itérer explicitement: xxx

par exemple: xxx

mais vous pouvez également utiliser np.ogrid au lieu de deux linspace :

importer numpy sous forme np xxx

it quelque peu dépend de ce que vous êtes f est. Si elle contient des fonctions telles que math.sin , vous devez les remplacer par numpy.sin .

s'il ne s'agit pas de Numpy Ensuite, vous devez coller avec votre option ou éventuellement à l'aide de énumérer lors de la boucle: xxx

Ceci a l'avantage que vous n'avez pas besoin de codé de hard votre plage (ou xrange ) ou utilisez le len (a) comme entrée. Mais en général, s'il n'y a pas une énorme différence de performance 1 , utilisez la méthode que vous et d'autres personnes à l'aide de votre code comprendra facilement.


1 Si votre A et B est numpy.array s puis il y aurait une différence de performance significative car NUMPY peut traiter les tableaux beaucoup plus rapidement si non LISTE <-> NUMPY.ARRAY Les conversions sont requises.


0 commentaires