2017-11-17 2 views
0

Also würde ich gerne über zwei Listen gleichzeitig iterieren und ich brauche auch den Index mit dem folgenden Code getan. Beides ist für mich einfach, aber ist es auch möglich, zwei Anwendungen im zweiten Fall aufzuzählen? Natürlich nehmen wir an, dass beide var-Arrays die gleiche Länge haben.Python Joint Enumerate mit mehreren Variablen

import numpy as np 

def _eqn(y, variables, sign=-1.0): 
    f = 0 
    for i,x in enumerate(variables): 
     f += x/(1+0.06)**(i+1) 
    return float(sign*(y + f)) 


_eqn(1,np.array([1,1])) 

def _eqn2(y, vars1, vars2, sign=-1.0): 
    f = 0 
    n = len(vars1) 
    for x,y,i in zip(vars1, vars2, range(n)): 
     f += (x+y)/(1+0.06)**(i+1) 
    return float(sign*(y + f)) 


_eqn2(1,np.array([1,1]),np.array([1,1])) 
+0

Haben Sie es versucht? –

Antwort

4

Ja, ist es möglich, ... wenn auch mit einer leichten Änderung

def _eqn2(y, vars1, vars2, sign=-1.0): 
    f = 0 
    for i, (v1,v2) in enumerate(zip(vars1, vars2)): 
     f += (v1+v2)/(1+0.06)**(i+1) 
    return float(sign*(y + f)) 

Sie Tupel der zip Ihrer vars aufzuzählen.

Obwohl Sie mit numpy Arrays arbeiten, bin ich sicher, dass es eine bessere Möglichkeit gibt, das gleiche Ziel zu erreichen, ohne eine Python for Schleife zu verwenden.

Auch nahm die Freiheit der Änderung der Namen von Variablen seit Sie usign y in zwei verschiedenen Kontexten und könnte verwirrend sein.

+0

Ok, kannst du einen Tipp geben, ohne eine For-Schleife zu lösen? – Peterhack

+0

Sie erstellen ein Array von Zählern und einen anderen Nenner (a ** b in numpy arbeitet als elementweise Exponentiation) und dann teilen Sie Zähler durch Nenner, der auch eine vektorisierte Operation ist, und am Ende machen Sie eine Summe dieses Arrays . Das wird die ganze For-Schleife eliminieren. Wenn Ihre Listen/Arrays schließlich groß genug sind, kann es leistungsfähig sein. –

+0

Sie haben recht, dass dies mit vektorisierten Operationen leicht erreicht werden kann. Und tatsächlich wird es mit größeren Arrays schneller. Du denkst das ist der beste Weg? 'f = ((vars1 + vars2)/(1 + 0.06) ** (np.bereich (len (vars1)) + 1)). sum()' – Peterhack