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) code> pour un (x, y) code> meshgrid.
7 Réponses :
Vous pouvez faire quelque chose comme
Si vous le définissez à la fois, vous pouvez utiliser une compréhension de la liste; si vous devez utiliser un Addition: em> Je ne sais pas avec ce que z code> qui est déjà là, cependant, vous Je ne peux pas faire ça et votre code concerne le soirée que vous obtiendrez. p> lingrid code> 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. p> p>
Ouais. Votre code tel que présenté dans la question est bien. P>
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). P>
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. P>
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.
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
Il convient de noter que toutes ces solutions produisent une liste unidimensionnelle au lieu d'une liste imbriquée comme la solution de OP.
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]]
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)]
Votre par exemple: p> mais vous pouvez également utiliser importer numpy sous forme np p> it quelque peu dépend de ce que vous êtes s'il ne s'agit pas de Ceci a l'avantage que vous n'avez pas besoin de codé de hard votre 1 sup > Si votre linspace code> on dirait que cela pourrait être np.linspace code> . Si vous pouvez utiliser des tableaux numpus sans avoir à itérer explicitement: np.ogrid code> au lieu de deux linspace code>: p> f code> est. Si elle contient des fonctions telles que math.sin code>, vous devez les remplacer par numpy.sin code>. P> Numpy code > Ensuite, vous devez coller avec votre option ou éventuellement à l'aide de énumérer code> lors de la boucle: p> plage code> (ou xrange code>) ou utilisez le len (a) code> comme entrée. Mais en général, s'il n'y a pas une énorme différence de performance 1 sup>, utilisez la méthode que vous et d'autres personnes à l'aide de votre code comprendra facilement. P>
A code> et B code> est numpy.array code> s puis il y aurait une différence de performance significative car NUMPY peut traiter les tableaux beaucoup plus rapidement si non LISTE CODE> <-> NUMPY.ARRAY CODE> Les conversions sont requises. P> P>